一尘不染

如何处理JavaScript中的浮点数精度?

javascript

我有以下虚拟测试脚本:

function test() {

  var x = 0.1 * 0.2;

  document.write(x);

}

test();

这将打印结果,0.020000000000000004而仅打印结果0.02(如果使用计算器)。据我了解,这是由于浮点乘法精度的错误。

有没有人有一个好的解决方案,这样在这种情况下我可以获得正确的结果0.02?我知道还有类似的函数,toFixed或者四舍五入是另一种可能性,但是我真的想在不进行任何四舍五入的情况下打印出完整的数字。只是想知道你们中的一个人是否有一些不错的,优雅的解决方案。

当然,否则我将四舍五入到大约10位数字。


阅读 272

收藏
2020-04-22

共1个答案

一尘不染

从浮点指南:

我应该怎么做才能避免这个问题?

这取决于您正在执行哪种计算。

  • 如果您确实需要精确地将结果相加,尤其是在使用金钱时,请使用特殊的十进制数据类型。
  • 如果您只是不想看到所有这些多余的小数位:只需在显示结果时将结果格式舍入为固定的小数位数即可。
  • 如果没有可用的十进制数据类型,则替代方法是使用整数,例如,完全用美分进行货币计算。但这是更多的工作,并且有一些缺点。

请注意,只有在您确实需要特定的精确 十进制
行为时,第一点才适用。大多数人并不需要它,只是因为他们的程序无法正确处理1/10之类的数字而感到恼火,却没有意识到如果发生1/3,即使出现相同的错误也不会眨眼。

如果第一点确实适用于您,请对JavaScript使用BigDecimal,这一点都不优雅,但实际上可以解决问题,而不是提供不完善的解决方法。

2020-04-22