2013-05-10 109 views
2

將字符串到數字產生遞增的值:JavaScript的Number構造奇怪的行爲

var n = '9999999999999999'; 
console.log(n); // -> 9999999999999999 
var nn = Number(n) 
console.log(nn); // -> 10000000000000000 

如何避免這種情況?

+1

的默認偏舍入的模式如何避免什麼一倍甚至53位的數字最接近的價值?我猜想任意精度是IEEE754的一部分。 – raina77ow 2013-05-10 12:29:37

+1

http://wtfjs.com/2010/07/22/magic-increasing-number – drinchev 2013-05-10 12:37:39

+0

@ raina77ow如何避免這種行爲?我應該怎麼做才能獲得值爲9999999999999999的Number對象?或者,也許如何檢查數字是否會增加?如果我將'n'改爲''999''''數字'值爲'999'。 – 2013-05-10 12:41:06

回答

2

9999999999999999在JavaScript中作爲浮點數內部處理。由於它需要54位精度(位數爲log2(9999999999999999) = 53.150849512,由於小數位不存在,所以必須將結果打散),而IEEE 754只提供53位(1位),因此無法精確表示爲精度爲IEEE 754的雙精度隱含位+ 52個明確存儲的尾數位) - 少一點。因此,這個數字只是四捨五入。

由於在這種情況下只有一位丟失,所以即使是54位的數字也是完全可以表示的,因爲它們在該位中包含0,這會丟失。奇數54位數字四捨五入到恰好是給IEEE 754

[Source]