javascript数字构造函数奇怪的行为

时间:2013-05-10 12:27:50

标签: javascript string numbers type-conversion

将字符串转换为数字会产生递增的值:

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

如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

9999999999999999在JavaScript内部被视为浮点数。它不能以IEEE 754双精度精确表示,因为它需要54位精度(位数是log2(9999999999999999) = 53.150849512,并且由于小数位不存在,结果必须被提升) IEEE 754仅提供53位(1个隐含位+ 52个明确存储的尾数位) - 少一位。因此,这个数字很简单。

由于在这种情况下只丢失了一位,即使54位数字也可以准确表示,因为它们在位中包含0,这会丢失。考虑到IEEE 754的默认无偏舍入模式,奇数54位数被舍入到最接近的值,恰好是加倍的偶数53位数。

[Source]