web-dev-qa-db-ja.com

2つのparseFloat変数の合計が間違った10進数になるのはなぜですか

私がこの小さな機能を持っている場合:

<script type="text/javascript">

 function printFloat(){
      var myFloatNumber1 = document.getElementById('floatNumber1');
      var myFloatNumber2 = document.getElementById('floatNumber2');
      alert(parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value))
 }

</script>

<input type="text" id="floatNumber1"></input>
<input type="text" id="floatNumber2"></input>

<input type="button" onclick="printFloat()"/>

フィールド1に入力:221.58フィールド2に入力:2497.74

入力フィールドの2つの数値の合計が2桁の数字になると思います:2719.32しかし、結果は正しくない数値です...:2719.3199999999997

ラウンドでうまくいきますが、コードがこの数値でそれを行う理由がわかりません...他の数値の組み合わせでは、合計は正しいです...

14
Kennethvr

From The Floating-Point-Guide:

0.1 + 0.2のような私の数値が合計0.3になり、代わりに0.30000000000000004のような奇妙な結果が得られるのはなぜですか?

内部的には、コンピューターは0.1、0.2、0.3などの数値を正確に表すことができない形式(2進浮動小数点)を使用しているためです。

コードがコンパイルまたは解釈されるとき、「0.1」はすでにその形式で最も近い数値に丸められているため、計算が行われる前でも小さな丸め誤差が発生します。

あなたの場合、入力した値がparseFloat()によって変換されると、丸め誤差が発生します。

0.1 + 0.4のような他の計算が正しく機能するのはなぜですか?

その場合、結果(0.5)は浮動小数点数として正確に表すことができ、入力数の丸め誤差が互いに打ち消し合う可能性があります-しかし、それは必ずしも信頼できるとは限りません(たとえば、これら2つの場合)数値は最初に異なるサイズの浮動小数点表現で格納されました。丸め誤差は互いに相殺されない可能性があります)。

0.1 + 0.3のような他の場合、結果は実際には0.4ではありませんが、0.4が他の浮動小数点数よりも結果に近い最短の数になるように、十分に近いです。多くの言語では、実際の結果を最も近い小数に変換する代わりに、その数値が表示されます。

20
4
James

以下を実行するだけです。

function printFloat(){
      var myFloatNumber1 = document.getElementById('floatNumber1');
      var myFloatNumber2 = document.getElementById('floatNumber2');
      var total=parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value);
      alert(total.toFixed(2));
 }    
3
Maulik Kanani