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

新手上路,请多包涵

我有以下虚拟测试脚本:

function test() {
  var x = 0.1 * 0.2;
  document.write(x);
}
test();

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

有没有人有一个好的解决方案,以便在这种情况下我得到正确的结果 0.02 ?我知道有像 toFixed 或四舍五入这样的功能是另一种可能性,但我希望真正打印整数而不进行任何切割和四舍五入。只是想知道你们中的一个人是否有一些不错的、优雅的解决方案。

当然,否则我会四舍五入到 10 位数左右。

原文由 Juri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 725
2 个回答

浮点指南

我能做些什么来避免这个问题?

这取决于什么样的

你正在做的计算。

  • 如果你真的需要你的结果准确地加起来,尤其是当你

用钱工作:使用特殊的小数

数据类型。

  • 如果您只是不想看到所有这些额外的小数位:只需

格式化你的结果四舍五入到一个固定

时的小数位数

显示它。

  • 如果您没有可用的十进制数据类型,另一种方法是工作

用整数,例如做钱

完全以美分计算。但

这是更多的工作,并且有一些

缺点。

请注意,仅当您确实需要特定的精确 小数 行为时才适用第一点。大多数人不需要这个,他们只是对他们的程序不能正确处理像 110 这样的数字感到恼火,却没有意识到如果出现 1/3,他们甚至不会因同样的错误而眨眼。

如果第一点真的适用于您,请 为 JavaScript 使用 BigDecimal ,它一点也不优雅,但实际上解决了问题,而不是提供了一个不完美的解决方法。

原文由 Michael Borgwardt 发布,翻译遵循 CC BY-SA 4.0 许可协议

我喜欢 Pedro Ladaria 的解决方案并使用类似的东西。

 function strip(number) {
    return (parseFloat(number).toPrecision(12));
}

与 Pedros 解决方案不同,这将四舍五入 0.999…重复并且在最低有效数字上精确到加/减一。

注意:处理 32 位或 64 位浮点数时,您应该使用 toPrecision(7) 和 toPrecision(15) 以获得最佳结果。有关原因的信息,请参阅 此问题

原文由 linux_mike 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏