将字符串转换为数字会产生递增的值:
var n = '9999999999999999';
console.log(n); // -> 9999999999999999
var nn = Number(n)
console.log(nn); // -> 10000000000000000
如何避免这种情况?
最佳答案
9999999999999999
在 JavaScript 内部被视为 float 。 IEEE 754中无法准确表示 double ,因为它需要 54 位精度(位数为 log2(9999999999999999)
= 53.150849512,并且由于小数位不存在,因此结果必须向上舍入),而 IEEE 754 仅提供 53 位位(1 个隐式位 + 52 个显式存储的尾数位)- 少一位。因此,数字只是四舍五入。
由于在这种情况下仅丢失一位,因此即使 54 位数字也可以精确表示,因为它们在该位中仍然包含 0,从而丢失了。考虑到 IEEE 754 的默认无偏舍入模式,奇数 54 位数字将四舍五入到最接近的值,该值恰好是双倍偶数 53 位数字。
关于javascript Number 构造函数奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482279/