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>