为什么JavaScript的数字*显示*大数字不准确?

时间:2014-08-21 00:31:54

标签: javascript rounding double-precision floating-point-conversion

所以在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在显示数字时表现得像

1 个答案:

答案 0 :(得分:3)

JavaScript整数只能是+/- 2 53 ,即:

9007199254740992

你的一个号码是

111111111111111106560

这远远超出了可以精确表示为整数的数字范围。

这遵循IEEE 754:

  • 符号位:1位
  • 指数宽度:11位
  • 显着精度:53位(显式存储52位)

修改

数字的显示有时会被JavaScript引擎舍入,是的。但是,使用toFixed方法可以覆盖它。 (警告,已知在某些版本的IE下,toFixed会被破坏。)

在您的控制台中,键入:

111111111111111122944..toFixed(0)
  

“111111111111111114752”