【问题标题】:Calculating percentages in js [duplicate]计算JS [重复]中的百分比
【发布时间】:2013-05-05 13:15:10
【问题描述】:

我正在尝试使用 javascript 创建一个简单的百分比计算器。

我在控制台中尝试了一个简单的计算(试一试):

106 / 100 * 10

它还给我:

10.600000000000001

这里发生了什么?括号没有区别,并且并非每个数字都发生这种情况。我希望结果是10.6 对吗?任何人都可以提供解释吗?这不是特定于浏览器的,它发生在 Chrome 开发工具和 firebug 中。

【问题讨论】:

标签: javascript math percentage


【解决方案1】:

不,结果足够正确(即使更改操作顺序可能会导致不同的结果),这是 IEEE754 浮点存储的奇迹之一:数字不像您那样存储的事实的后果看到他们,那是一些十进制数字和一个逗号,但作为

K * 2 ^ N

其中 K 和 N 是有符号整数。

当然不是所有的数字都可以准确存储,其他的只能接近。

我建议你阅读this introduction to IEEE754 computing

您需要在将数字输出给用户时对其进行格式化,例如使用

var string = myNumber.toFixed(1);

【讨论】:

    【解决方案2】:

    双精度。数字以 2 的幂的形式存储在计算机中,例如1/2 + 1/4 + 1/8... 所以当打印为小数时,它们可能不准确。

    【讨论】:

      【解决方案3】:

      并非所有十进制数字都具有精确的二进制表示,因此当您尝试使用浮点数进行数学运算时,此类问题经常发生。

      转换成二进制,你的操作如下:

      106 = 64 + 32 + 8 + 2 = 1101010
      100 = 64 + 32 + 4 = 1100100
      1101010 / 1100100 = 1010.10011001100...
      

      然后将其乘以 10,或二进制的 101 并得到

      1010.10011001100... * 101 = 1010.1001100110011001100...
      

      哪个不相当评估为 10.6。

      在您的特定情况下,该数字已被截断为 1010.10011001100110011001100110011001 或 36 位。

      【讨论】:

        【解决方案4】:

        你可以试试 (106 / 1000) * 100

        【讨论】:

        • 确实,改变操作顺序会导致不同的近似值,在这里,会导致不同的结果,但基本原则是我们通常不能针对没有格式化的可显示结果。
        【解决方案5】:

        试试下面:

        Var myAnswer = 106 / 100 * 10;
        var result = myAnswer.toFixed(1);
        

        Javascript: formatting a rounded number to N decimals

        这将如何为您工作...

        享受你的一天..!!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 2020-03-21
          • 2013-11-19
          • 2015-05-09
          相关资源
          最近更新 更多