山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

Javaプリミティブ型小数の誤差

Javaのプリミティブ型のfloatやdoubleでは

小数の誤差が発生します。

これはコンピュータの内部では2進数で数を表現しているためです。

10進数では小数点以下の桁数が有限でも2進数では無限になる

ことがあります。

そうすると一定の桁数以下では2進数では切捨てが発生し、

実際の数値とずれます。


詳しくはネット上にいろいろ解説しているページがあるので

見てもらうとして、実際どれくらい発生するかというと、

小数を扱うと結構よくずれます。

0.1くらいずれることもあります。

めったに起こらないだろう、ずれても0.0001くらいだろうと

思っていると痛い目にあいます。


これを解決するにはJavaの場合だとBigDecimalというクラスが

あります。

BigDecimalは内部的により誤差が生じにくい形式で数値を保持し、

誤差が生じる場合にもその処理方法を細かく指定できます。

ただし、以下のような注意点があります。

・プリミティブ型ではないので演算はメソッドを使わないといけません。

・理論的にはメモリーやCPUをより多く使うのでパフォーマンスが
 落ちる可能性があります。

小数の取り扱いにはご注意を。