2017-08-22 28 views
-1

所以我在這裏讀這樣的回答: Is floating point math broken?添加整數的JavaScript,雙浮

的話,因爲JS每個數字是雙精度浮點數0.1 + 0.2例如將不等於0.3。

但我不明白爲什麼它不會發生整數?爲什麼1 + 2總是等於3等等。似乎像1或2這樣的整數類似於0.1和0.2在二進制64中沒有完美的表示,所以他們的數學應該有時會破壞,但從來沒有發生過。

這是爲什麼?

+1

整數沒有與它們相關的精度。 –

+0

它也打破整數。嘗試'v = Math.pow(2,54)'。然後增加它。 –

+1

我不喜歡通過與理論的普遍聯繫來解決這個問題。 –

回答

1

但我不明白爲什麼它不會發生整數?

是這樣,整隻擁有甚大,他們打的IEEE-754格式的限制之前:

var a = 9007199254740992; 
 
console.log(a);  // 9007199254740992 
 
var b = a + 1; 
 
console.log(b);  // still 9007199254740992 
 
console.log(a == b); // true

0

浮點格式,如IEEE- 754基本上是描述該值的表達式,如下所示:

value := sign * mantissa * 2^exponent 

尾數是各種大小的整數。對於四字節浮點,尾數是24位,對於八字節浮點,尾數是48位。如果指數爲0,則表達式的值僅由符號和尾數決定。實際上,這就是JavaScript的整體表示方式。

似乎讓大多數人感到意外的是由於基數2指數而不是基數10.我們接受,在基數10中,1/3或2/3的結果不能沒有無限的精確表示數字的數量或接受的舍入誤差。同樣,基數2中也有類似的問題。不幸的是,對於我們的基礎10思維模式,這些分數通常涉及10的負冪。