2014年2月19日水曜日

小数点を持つ値の計算で誤差が生まれる件(JavaScript)

今更・・・という話ですが、とあるシステムでの不具合にて、原因を調査していたところ発覚。

小数点がある数値を含む計算を行った際に、計算結果が合わないという事が起きます。


理由としては、JavaScriptの演算はIEEE 754という規格に従って実装されているという事。
仕様であり、JavaScript的には正しい値なので避けようがありません。


ちなみに、以下のような演算でも誤差が起きます。

(17.955 * 100000) = 1795499.9999999998


原理や理屈は「演算誤差」などで調べてもらうとして、利用するソフトウェアによっては発生しうる現象です。


今回のケースでは、金額の計算だったため、コンピューターの都合による誤差は認められません。。。。

対処法

「いったん整数に変換してから演算して戻す」などがよくありがちですが、
JavaScriptだとそこそこの行数でロジックを書かなければだめそうなので
こちらは別途纏めたいと思います。


追伸

net framework(vb.net)でも同じ結果となりました。こちらは、小数点の値に対して、[Decimal]を明示する事で対処できそうです。

(Convert.ToDecimal(17.955) * 100000) = 179500D

Javaでも起きますね。こちらはBigDecimal型を使って計算すれば対処できます。


0 件のコメント: