JavaScript 小数点演算誤差を減らす

最終更新日

JavaScriptで小数演算を行うと、誤差が発生して期待する精度が得られない場合があります。ここでは、演算誤差を減らす方法を記載します。

JavaScriptに限らず多くのコンピュータ言語やCPUでは、浮動小数演算を行うと誤差が発生します。これは小数が2の-n乗の和で表現されるためで、値によっては表現することができないためです。これを軽減させるには、小数値を10倍するなどしてゲタをはかせます。整数演算の場合は小数演算と異なり、2のn乗で表現できるため、誤差が発生しません。また、BigDecimal.jsライブラリを使用することでも、演算誤差は発生しません。

<body>
<h1>演算誤差を減らす</h1>
<div>通常:<output></output></div>
<div>補正:<output></output></div>
<script>
    window.addEventListener("load" , function(){
        var ele = document.getElementsByTagName("output");
        //ゲタをはかせずに0.1を10回加算する
        var num1 = 0;
        for(var i=0; i<10; i++){
            //0.1の場合、加算すると誤差発生
            num1 = num1 + 0.1;
        }
        ele[0].innerHTML = num1;
        //ゲタをはかせて0.1を10回加算する
        var jackup = 10;//10倍。10のゲタをはかせる
        var num2 = 0;
        for(i=0; i<10; i++){
            //0.1の場合、加算すると誤差発生
            num2 = num2 + 0.1*jackup;
        }
        //10倍したので最後に10で除算
        num2 = num2 / jackup;
        ele[1].innerHTML = num2;
    }, false);
</script>
   
</body>
実行結果
実行結果