- = 0.1奇怪的结果

时间:2011-04-13 14:38:45

标签: javascript floating-point

  

可能重复:
  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

有人可以解释那里发生了什么吗?

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

这将解决您的问题

http://jsfiddle.net/AVPNx/

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

答案 2 :(得分:6)

来自The Floating-Point Guide

  

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

     

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

     

编译代码时   解释,你的“0.1”已经存在   四舍五入到最接近的数字   格式,这导致一个小的   甚至在之前的舍入错误   计算发生了。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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