0

重複の可能性:
Javascript 数学エラー: 不正確な浮動小数点数

アニメーションを作成するための次のコードがあります(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がそれほど近い数ではないことを望んでいます。残念ながら、これはすべての反復で発生します。

4

2 に答える 2

10

@Oleksiが指摘したように、を出力0.3するには、使用でき、浮動小数点数にはわずかな計算ミスがあります。toFixed

console.log((0.1 + 0.2).toFixed(1)); // 0.3
于 2012-07-01T19:44:54.913 に答える
1

これは予期されることです。コンピューターでの浮動小数点演算には、コンピューター内部に格納される方法が原因で、このような小さな精度誤差があります。詳細については、What Every Computer Scientist Should Know About Floating-Point Arithmeticを読むことをお勧めします。

無限に多くの実数を有限数のビットに圧縮するには、近似表現が必要です。無限に多くの整数がありますが、ほとんどのプログラムでは、整数計算の結果を 32 ビットで格納できます。対照的に、ビット数が固定されている場合、実数を使用したほとんどの計算では、その数のビットを使用して正確に表現できない量が生成されます。したがって、浮動小数点計算の結果は、その有限表現に適合させるために丸めなければならないことがよくあります。この丸め誤差が浮動小数点演算の特徴です。

これに似た質問がかなり多く寄せられます。これを参照してください。

于 2012-07-01T19:42:32.060 に答える