所以我在這裏讀這樣的回答: Is floating point math broken?添加整數的JavaScript,雙浮
的話,因爲JS每個數字是雙精度浮點數0.1 + 0.2例如將不等於0.3。
但我不明白爲什麼它不會發生整數?爲什麼1 + 2總是等於3等等。似乎像1或2這樣的整數類似於0.1和0.2在二進制64中沒有完美的表示,所以他們的數學應該有時會破壞,但從來沒有發生過。
這是爲什麼?
所以我在這裏讀這樣的回答: Is floating point math broken?添加整數的JavaScript,雙浮
的話,因爲JS每個數字是雙精度浮點數0.1 + 0.2例如將不等於0.3。
但我不明白爲什麼它不會發生整數?爲什麼1 + 2總是等於3等等。似乎像1或2這樣的整數類似於0.1和0.2在二進制64中沒有完美的表示,所以他們的數學應該有時會破壞,但從來沒有發生過。
這是爲什麼?
但我不明白爲什麼它不會發生整數?
是這樣,整隻擁有甚大,他們打的IEEE-754格式的限制之前:
var a = 9007199254740992;
console.log(a); // 9007199254740992
var b = a + 1;
console.log(b); // still 9007199254740992
console.log(a == b); // true
浮點格式,如IEEE- 754基本上是描述該值的表達式,如下所示:
value := sign * mantissa * 2^exponent
尾數是各種大小的整數。對於四字節浮點,尾數是24位,對於八字節浮點,尾數是48位。如果指數爲0,則表達式的值僅由符號和尾數決定。實際上,這就是JavaScript的整體表示方式。
似乎讓大多數人感到意外的是由於基數2指數而不是基數10.我們接受,在基數10中,1/3或2/3的結果不能沒有無限的精確表示數字的數量或接受的舍入誤差。同樣,基數2中也有類似的問題。不幸的是,對於我們的基礎10思維模式,這些分數通常涉及10的負冪。
整數沒有與它們相關的精度。 –
它也打破整數。嘗試'v = Math.pow(2,54)'。然後增加它。 –
我不喜歡通過與理論的普遍聯繫來解決這個問題。 –