私がこの小さな機能を持っている場合:
<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
ラウンドでうまくいきますが、コードがこの数値でそれを行う理由がわかりません...他の数値の組み合わせでは、合計は正しいです...
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が他の浮動小数点数よりも結果に近い最短の数になるように、十分に近いです。多くの言語では、実際の結果を最も近い小数に変換する代わりに、その数値が表示されます。
以下を実行するだけです。
function printFloat(){
var myFloatNumber1 = document.getElementById('floatNumber1');
var myFloatNumber2 = document.getElementById('floatNumber2');
var total=parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value);
alert(total.toFixed(2));
}