This question already has answers here:
Why is 9999999999999999 converted to 10000000000000000 in JavaScript?
                                
                                    (5个答案)
                                
                        
                                5年前关闭。
            
                    
将字符串转换为数字会产生递增的值:

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


如何避免这种情况?

最佳答案

在JavaScript中9999999999999999在内部被视为浮点数。它不能精确地表示为IEEE 754双精度,因为它需要54位精度(位数为log2(9999999999999999) = 53.150849512,并且由于不存在小数位,因此必须提高结果),而IEEE 754仅提供53位(1个隐含位+ 52个显式存储的尾数位)-少一位。因此,数字只是四舍五入。

由于在这种情况下仅丢失一位,因此即使54位数字也可以精确表示,因为它们在位中仍然包含0,而这会丢失。鉴于IEEE 754的默认无偏四舍五入模式,奇数的54位数字被四舍五入为最接近的值,该值恰好是53位数字的两倍。

[Source]

09-18 02:23