为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2019-05-22 13:15:56
我有以下虚拟测试脚本:function test(){     var x = 0.1 * 0.2;     document.write(x);}test();这将打印结果0.020000000000000004,只应打印0.02(如果您使用计算器)。据我所知,这是由于浮点乘法精度的误差。有没有人有一个很好的解决方案,以便在这种情况下,我得到正确的结果0.02?我知道有类似的函数toFixed或舍入将是另一种可能性,但我想真正打印整个数字没有任何切割和舍入。只是想知道你们其中一个人是否有一些漂亮,优雅的解决方案。当然,否则我会转到大约10位左右。如何处理JavaScript中的浮点数精度?
查看完整描述

4 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

浮点指南

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

这取决于你正在做什么样的计算。

  • 如果你真的需要你的结果准确地加起来,特别是当你使用钱时:使用特殊的十进制数据类型。

  • 如果您只是不想看到所有这些额外的小数位:只需将结果格式化为显示它时固定的小数位数。

  • 如果您没有可用的十进制数据类型,则可以选择使用整数,例如完全以美分进行货币计算。但这是更多的工作,并有一些缺点。

请注意,第一点仅适用于您确实需要特定的精确十进制行为。大多数人并不需要这样,他们只是因为他们的程序无法正常使用1/10这样的数字而没有意识到如果它以1/3发生它们甚至不会眨眼同样的错误。

如果第一点确实适用于您,请使用BigDecimal for JavaScript,这根本不是优雅的,但实际上解决了问题而不是提供不完美的解决方法。


查看完整回答
反对 回复 2019-05-22
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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

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

与Pedros解决方案不同,这将向上舍入0.999 ...重复并且在最低有效数字上精确到正/负1。

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


查看完整回答
反对 回复 2019-05-22
?
慕森卡

TA贡献1806条经验 获得超8个赞

你只是在进行乘法运算吗?如果是这样,那么你可以利用一个关于十进制算术的巧妙秘密。就是这样NumberOfDecimals(X) + NumberOfDecimals(Y) = ExpectedNumberOfDecimals。也就是说,如果我们有,0.123 * 0.12那么我们知道将有5个小数位,因为0.123有3个小数位并且0.12有两个。因此,如果JavaScript给了我们一个数字,0.014760000002我们可以安全地舍入到小数点后第五位,而不用担心会失去精度。


查看完整回答
反对 回复 2019-05-22
  • 4 回答
  • 0 关注
  • 716 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信