2013-05-10 82 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]