重複の可能性:
JavaScript の数学は壊れていますか?
Chrome コンソールまたは Firebug で4.08-1.36を実行しようとすると、奇妙な動作に気付きました。コンソールは、結果が 2.72 であるべきときに、結果として2.7199999999999998を返します。
私はこれがどのように可能であるか疑問に思っていました。何か案は?
重複の可能性:
JavaScript の数学は壊れていますか?
Chrome コンソールまたは Firebug で4.08-1.36を実行しようとすると、奇妙な動作に気付きました。コンソールは、結果が 2.72 であるべきときに、結果として2.7199999999999998を返します。
私はこれがどのように可能であるか疑問に思っていました。何か案は?
これは、浮動小数点数を扱っているためです。整数値には特定の範囲に対して設定された数の可能性がありますが(つまり、0から9までの値は正確に10個あります)、小数点値の追加を開始すると、無限の可能性があります。これらの値を固定メモリ空間に格納できるようにするために、コンピュータは浮動小数点演算を適用します。これは、その固定メモリ空間に広範囲の数値を格納できる近似を使用します。この近似のために、あなたは時々あなたのような一見奇妙な結果に終わる可能性があります。それはあなたが期待しているものとほぼ同じですが、正確ではありません。
詳細については、 http://en.wikipedia.org/wiki/Floating_pointを参照してください。
コンピュータは数値を 10 進数ではなく 2 進数で保存します。分数の 1/3 を 10 進数で正確に表すことができないのと同様に、分数の 1/10 を 2 進数で正確に表すことはできません。
あなたの例のすべての数値は、このカテゴリに分類されます。2 進数では、10 進数 4.08 は 100.00010100011110101110... になり、2 進小数点の後の数字は永遠に繰り返されます。もう 1 つの値 1.36 は 1.01011100001010001111.... になり、それらの差 2.72 は 10.10111000010100011110... になります。それぞれの場合で、これも無限に繰り返される 2 進数の分数です。
人間が見るために 10 進数に変換し直す場合、コンピュータは可能な限り最も近い一致に丸めますが、これは常に意図した正確な値とは限りません。