【问题标题】:Javascript adding extra precision when doing additions [duplicate]Javascript在添加时增加额外的精度[重复]
【发布时间】:2012-06-26 19:11:18
【问题描述】:

可能重复:
Is JavaScript's Math broken?

关于原因的任何想法:

(872.23 + 2315.66 + 4361.16) == 7549.05

在 Javascript 控制台(例如 Chrome 开发者控制台)中返回 false?

如果我用我的计算器试一试,左边确实是 7549.05...但是,Javascript 将它显示为 7549.049999999999。我可以“修复”它或将其舍入,或者……但我为什么要为简单的添加而这样做?

谢谢

【问题讨论】:

    标签: javascript math floating-point numbers rounding


    【解决方案1】:

    【讨论】:

    • 谢谢。当我发布它时,我已经用关键字“float”标记了我的问题,因为我怀疑这就是原因。起初它看起来像是一个 JS 问题,因为我用 SQL 做同样的事情,它给了我想要的东西。我想这取决于实现。
    【解决方案2】:

    这不是 Javascript 增加了额外的精度,而是您的计算机的浮点表示无法准确地表示您的数字。通过使用有理数或定点(而不是浮点)算术来绕过它。

    【讨论】:

      【解决方案3】:

      通过使用小数,您使用的是浮点数。您必须了解一点关于浮点是如何以二进制形式表示的,以及二进制浮点加法如何工作才能理解为什么添加浮点数并不总能解决您想要的问题。

      这是您可能想看一眼的快速谷歌搜索结果:The Complete Javascript Number Reference

      另外,如果您想了解浮点是如何用二进制表示的,请查看 Wikipedia 上的 IEEE floating point

      在这种情况下,您最好的选择是四舍五入。

      【讨论】:

        【解决方案4】:

        这是因为浮点数在硬件中的表示方式(可能是 32 位,但在任何位数中都是相同的)。基本上问题是你不能准确地表示像“7549.05”这样的东西(更多关于这个问题的信息在wikipedia)。

        因此,对于实际应用,如果数字是货币,一个不错的选择是乘以 100,因此它们始终是整数,并使用整数进行运算(在加法、减法或乘法时会得到很好的结果)。

        【讨论】:

        • 谢谢,我怀疑是浮动问题
        猜你喜欢
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        • 2020-09-30
        • 2014-11-06
        • 2012-11-16
        • 2021-07-30
        • 1970-01-01
        • 2011-12-05
        相关资源
        最近更新 更多