所以在JavaScript中,111111111111111111111 == 111111111111111110000。只需键入任何长数字-至少约17位数字-即可看到其效果;)
这是因为JavaScript使用双精度浮点数,并且某些非常长的数字文字不能准确表示。相反,这些数字会被四舍五入到最接近的可表示数字。例如,参见什么是JavaScript的最高整数值,Number可以达到而不失去精度? 然而,根据IEEE-754进行计算,我发现[111111111111111106560,111111111111111122944]内的每个数字都将在内部替换为111111111111111114752。但是,它并没有显示为...4752这个数字,而是显示为111111111111111110000。因此,JavaScript显示了那些尾随的零,从而使真实行为变得模糊不清。这特别令人讨厌,因为像263这样的偶数,其表示精度很高,也会像上述描述一样“四舍五入”。
所以,我的问题是:为什么JavaScript在显示数字时会像这样表现?
这是因为JavaScript使用双精度浮点数,并且某些非常长的数字文字不能准确表示。相反,这些数字会被四舍五入到最接近的可表示数字。例如,参见什么是JavaScript的最高整数值,Number可以达到而不失去精度? 然而,根据IEEE-754进行计算,我发现[111111111111111106560,111111111111111122944]内的每个数字都将在内部替换为111111111111111114752。但是,它并没有显示为...4752这个数字,而是显示为111111111111111110000。因此,JavaScript显示了那些尾随的零,从而使真实行为变得模糊不清。这特别令人讨厌,因为像263这样的偶数,其表示精度很高,也会像上述描述一样“四舍五入”。
所以,我的问题是:为什么JavaScript在显示数字时会像这样表现?
printf("%lf", n);
)。 - purefanatic