- = 0.1奇怪的结果

atl*_*vis 8 javascript floating-point

可能重复:
在.NET中双重乘法断开?

JavaScript代码:

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

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

我期望:

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
Run Code Online (Sandbox Code Playgroud)

但得到了这个:

0.9
0.8
0.7000000000000001
0.6000000000000001
0.5000000000000001
0.40000000000000013
0.30000000000000016
0.20000000000000015
0.10000000000000014
1.3877787807814457e-16
-0.09999999999999987
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*han 7

你看到了计算机进行浮点运算的方法.例如,参见http://en.wikipedia.org/wiki/Floating_point#Machine_precision


mr_*_*air 6

这将解决您的问题

http://jsfiddle.net/AVPNx/

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


Mic*_*rdt 6

浮点指南:

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

因为在内部,计算机使用的格式(二进制浮点)无法准确地表示0.1,0.2或0.3之类的数字.

编译或解释代码时,"0.1"已经四舍五入到该格式中最接近的数字,即使在计算发生之前也会导致小的舍入误差.

  • +1这应该是已接受的答案(或者我的答案). (2认同)