所以在JavaScript中,111111111111111111111 == 111111111111111110000。只需键入任意长号 - 至少约17位数 - 即可查看其中的操作; - )
这是因为JavaScript使用双精度浮点数,并且无法准确表达某些非常长的数字文字。相反,这些数字可以四舍五入到最接近的可表示数字。参见例如What is JavaScript's highest integer value that a Number can go to without losing precision?
然而,根据IEEE-754进行数学计算,我发现[111111111111111106560,111111111111111122944]内的每个数字都将被内部的111111111111111114752取代。但是它没有显示这个 ... 4752 数字,而是显示为111111111111111110000.所以JavaScript显示了那些混淆真实行为的尾随零。这尤其令人讨厌,因为即使是2 63 的数字,它们也是可以准确表示的,可以得到“舍入”#34;如上所述。
所以我的问题是:为什么JavaScript在显示数字时表现得像?
答案 0 :(得分:3)
JavaScript整数只能是+/- 2 53 ,即:
9007199254740992
你的一个号码是
111111111111111106560
这远远超出了可以精确表示为整数的数字范围。
这遵循IEEE 754:
修改强>
数字的显示有时会被JavaScript引擎舍入,是的。但是,使用toFixed
方法可以覆盖它。 (警告,已知在某些版本的IE下,toFixed会被破坏。)
在您的控制台中,键入:
111111111111111122944..toFixed(0)
“111111111111111114752”