为什么 ++a 会增加两次?

4
今天在一次 JavaScript 面试中,我的朋友被问到了这个问题:
为什么 ++a 会使 a 的值增加两次?

a = b = 9**17-2
++a
console.log(a-b) //Why is it 2 ?


1
我得到了这段代码的结果是0 - Eugene Tsakh
2
浮点精度很有趣。 - GottZ
1
这不是安全整数,请检查Number.isSafeInteger(9**17-2),它的值为false。 - dankobgd
2
虽然我知道是什么导致了这个问题,但我认为这是一个不好的面试问题。我不喜欢间接的问题。解决它们总像是在玩彩票。有时你能很快得到答案,有时你可能只是运气不佳。 - GottZ
1个回答

5

这是因为该值大于Number.MAX_SAFE_INTEGER,无法使用IEEE754双精度数字(JS使用它作为数字表示格式)准确表示。

16677181699666566在IEEE754双精度中表示为1101100111111110011101111001100010000001100101000011

16677181699666568在IEEE754双精度中表示为1101100111111110011101111001100010000001100101000100

你可以看到二进制仍然相差一位,但这不足以以人类可读的格式正确显示它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接