可能重复:
JavaScript的Math是有问题的吗?
为什么JS会在这个简单的数学运算中出错?
console.log(.1 + .2) // 0.3000000000000004
console.log(.3 + .6) // 0.8999999999999999
我已经在许多地方寻找答案。一些教程(例如购物车表单)假装这个问题不存在,只是将值相加。行家提供了各种数学函数的复杂程序或提到JS“效果不佳”,但我还没有看到过解释。
可能重复:
JavaScript的Math是有问题的吗?
为什么JS会在这个简单的数学运算中出错?
console.log(.1 + .2) // 0.3000000000000004
console.log(.3 + .6) // 0.8999999999999999
这不是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。
总之,重点是,这并不取决于编程语言,而是取决于计算机本身。取决于编程语言的是如何显示数字。通常,编程语言会将数字四舍五入为一个可以接受的表示方式。显然,JavaScript不会这样做。
因此,你需要做的(内存中的数字已经足够准确)就是告诉JavaScript在将数字转换为文本时“好好”地四舍五入。
你可以尝试使用 sprintf
函数,它可以让你精细控制数字的显示方式。
来自浮点数指南:
为什么我的数字,像0.1 + 0.2这样的数字不会加起来得到一个漂亮的0.3,而是会得到一个奇怪的结果,比如0.30000000000000004?
因为在计算机内部,使用一种格式(二进制浮点数)无法准确地表示像0.1、0.2或0.3这样的数字。
当代码被编译或解释时,“0.1”已经被舍入到该格式中最接近的数字,这会导致小的舍入误差,甚至在计算发生之前就已经出现了。
该网站提供了详细的解释以及如何解决该问题的信息(以及如何确定在您的情况下是否存在问题)。