可能的重复:
JavaScript 的数学有问题吗? https://stackoverflow.com/questions/588004/is-javascripts-math-broken
为什么 JS 搞砸了这个简单的数学?
console.log(.1 + .2) // 0.3000000000000004
console.log(.3 + .6) // 0.8999999999999999
第一个示例大于正确结果,而第二个示例小于正确结果。 ???!!你如何解决这个问题?在执行运算之前是否必须始终将小数转换为整数?我是否只需要担心添加(* 和 / 在我的测试中似乎没有相同的问题)?
我已经在很多地方寻找答案。一些教程(例如购物车表单)假装问题不存在,只是将值添加到一起。大师们为各种数学函数提供了复杂的例程,或者顺便提到 JS“做得很差”,但我还没有看到解释。
这不是一个 JS 问题,而是一个更通用的计算机问题。浮点数无法正确存储所有十进制数,因为它们以二进制形式存储内容
例如:
0.5 is store as b0.1
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc
so in binary 0.1 is 0.00011...
但这是无止境的。
除非计算机必须在某个时刻停止。因此,如果在我们的示例中我们停在 0.00011,我们就会得到 0.09375 而不是 0.1。
无论如何,重点是,这不取决于语言,而是取决于计算机。数字的显示方式取决于语言。通常,语言将数字四舍五入为可接受的表示形式。显然 JS 没有。
所以你要做的(内存中的数字足够准确)只是告诉 JS 在将它们转换为文本时“很好地”舍入数字。
您可以尝试sprintf
函数可以让您很好地控制如何显示数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)