javascriptの小数計算して誤差が出る理由と対処法

javascriptで小数の演算を行うとたまに誤差が出ることがあります。これでハマったため、その理由と対処法について調べた内容をまとめました。

誤差が出る理由

javascriptの小数演算はIEEE 754(浮動小数点数演算標準) の規格に沿っているため誤差が出るようです。例えば以下のような感じ。最後の…0001が余計ですね。

87.4 * 8.114
>> 709.1636000000001

これが結構煩わしく、小数計算をした結果を表示するときなどに想定外な表示になってしまいます。

簡単に説明すると、javascriptでは小数を2進数で表現しているためこれが誤差の原因になるようです。
例えば、0.1を2進数で表現すると0.000110011001100…と無限小数となり、誤差の原因になります。

対処法

javaならBigDecimalを使うなどありますが、javascriptにそういったものはないため、強引に対処する必要があります。

まず、小数の演算後に誤差以外の小数がなくなるよう10^N倍します。その後、Math.round関数で小数を四捨五入し10^Nで割ることで、誤差が丸められます。
仕様にもよりますが小数第何位以降は四捨五入など定めておけばNは決めれるかと思います。

0.1 * 0.1
>>0.010000000000000002

Math.round( 0.1 * 0.1 * 100 ) / 100
>> 0.01

コメントを残す

メールアドレスが公開されることはありません。