我遇到了问题,我无法解释它。其实我很惊讶。 当我尝试将数字9933272057275866增加1时,它会自动添加2 !!! 请参阅以下代码:
let test = 9933272057275866;
let test2 = test+1;
console.log('Before:', test);
console.log('After:', test2);
console.log('Sub:', test2-test);
各自的输出:
Before: 9933272057275866
After: 9933272057275868
Sub: 2
这怎么可能?
环境是Javascript。我在Hackerrank提交了一个挑战时发现了这个问题,然后我也尝试在我自己的node.js环境中做同样的事情。结果相同!
发生了什么事?
答案 0 :(得分:8)
基本上,这是因为64位(*)不足以准确地表示数字。
4341 A521 1037 32ED
:9.93327205727586 6 ⨉10 15 4341 A521 1037 32EE
:9.93327205727586 8 ⨉10 15 看看它如何跳过它们之间的一个整数。在IEEE 754中,越高,数字越沿着数字线分布。要记住的一点是浮点数是近似值。这就是你得到这个结果的原因:
0.1 + 0.2 === 0.3 // false
IEEE 754中的最大安全整数是9007199254740991。
浮点算术更有趣的事实:
A + B == B + A // true, commutative, except when A or B is NaN
(A + B) + C == A + (B + C) // false, not associative
*值得一提的是,JavaScript(ECMAScript)中的数字表示为64位IEEE 754双精度数。 ref