Javascript添加0.1到0.2会导致0.30000000000000004

时间:2012-07-01 19:41:44

标签: javascript settimeout

  

可能重复:
  Javascript Math Error: Inexact Floats

我有以下代码来制作动画(doIt做动画但不相关)。

function recur(max, i){
    console.log("i: " + i);
    if ( i <= 1){
        setTimeout(function(){
            // doIt(max,i);
            recur(max, i + 0.1);                
        },100);
    } else {
        // OK
    }
}
recur(16,0);

但是,i值不一致。对于以下代码,输出为(Google Chrome 20):

i: 0 
i: 0.1 
i: 0.2 
i: 0.30000000000000004
i: 0.4 
i: 0.5 
i: 0.6 
i: 0.7 
i: 0.7999999999999999 
i: 0.8999999999999999 
i: 0.9999999999999999 
i: 1.0999999999999999 

为什么会这样?我想0.3不是那么接近的数字。不幸的是,这发生在每次迭代中。

2 个答案:

答案 0 :(得分:3)

要输出0.3,您可以使用toFixed,并且浮点数会略微错误计算,正如@Oleksi指出的那样。

console.log((0.1 + 0.2).toFixed(1)); // 0.3

答案 1 :(得分:1)

这是预期的。计算机上的Floating point操作有small accuracy errors这样,因为它们存储在计算机内部。有关详细信息,建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

  

将无数多个实数压缩成有限数量的位   需要近似的表示。虽然有无限的   许多整数,在大多数程序中,整数计算的结果都可以   以32位存储。相反,给定任意数量的位,   大多数带有实数的计算都会产生数量   不能使用那么多位来精确表示。因此   浮点计算的结果通常必须按顺序舍入   以适应其有限的表示。这个舍入误差是   浮点计算的特征。

与此类似的问题得到了很多询问。请参阅this