【问题标题】:-= 0.1 strange result [duplicate]-= 0.1 奇怪的结果 [重复]
【发布时间】:2011-08-04 19:05:07
【问题描述】:

可能重复:
Is double Multiplication Broken in .NET?

JavaScript 代码:

var n = 1; 
while ( n > 0 )
{
  n -= 0.1;
  document.body.innerHTML += n + "<br/>";
}

http://jsfiddle.net/UpUE6/4/

我预计:

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0

但是得到了这个:

0.9
0.8
0.7000000000000001
0.6000000000000001
0.5000000000000001
0.40000000000000013
0.30000000000000016
0.20000000000000015
0.10000000000000014
1.3877787807814457e-16
-0.09999999999999987

谁能解释那里发生了什么?

【问题讨论】:

标签: javascript floating-point


【解决方案1】:

您正在看到计算机进行浮点运算的方式的人工制品。例如,请参阅http://en.wikipedia.org/wiki/Floating_point#Machine_precision

【讨论】:

    【解决方案2】:

    并非所有数字都可以精确表示,即使它们有一个简单的十进制表示法。这是因为 JavaScript 使用 IEEE 754 来表示浮点值,因此使用基数 2 而不是基数 10。这导致您实际上并没有减去 0.1(即使您的源代码是这样说的),而是一些接近它的值。

    【讨论】:

      【解决方案3】:

      您正在处理一个浮点数。查看 toFixed 和 toPrecision 方法。

      【讨论】:

        【解决方案4】:

        这会解决你的问题

        http://jsfiddle.net/AVPNx/

        var n = 1;
        while ( n > 0 ){
            n -= 0.1;
            result = n.toFixed(1);
            document.body.innerHTML += result + "<br/>";
        }
        

        【讨论】:

          【解决方案5】:

          来自The Floating-Point Guide

          为什么我的数字,比如 0.1 + 0.2 加起来不是很好的 0.3,而且 相反,我得到了一个奇怪的结果,比如 0.30000000000000004?

          因为在内部,计算机使用 格式(二进制浮点) 不能准确地表示一个数字 像 0.1、0.2 或 0.3 一样。

          当代码被编译或 解释,你的“0.1”已经 四舍五入到最接近的数字 格式,这会导致一个小 舍入误差甚至在 计算发生。

          【讨论】:

          • +1 这应该是公认的答案(或者我的答案)。
          猜你喜欢
          • 2020-10-22
          • 2015-04-14
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          相关资源
          最近更新 更多