BigDecimalとdoubleの性能差
2015/03/01
Javaでdouble型とかの浮動小数点で小数を扱う場合、誤差が発生します。(例えば10進数の0.1を2進数にすると無限小数になり誤差が発生します)
そのため、誤差を許さないシステムでは小数を10進(固定小数)で扱うBigDecimalを使って小数点の演算をします。
ただ、BigDecimalを使うと性能がかなり落ちます。
というわけで簡単に測定してみました。
測定条件
ノートPC(CORE i3, WIndows8, JDK1.8)で以下の計算を1千万回繰り返しました。
(1234 * 124.56) – (1234*123.45)
測定結果
double型 : 610[ms] BigDecimal型 : 1094[ms] strictfp宣言ありのdouble型 : 540[ms]
strictfp宣言は、浮動小数点演算をIEEE754に従って計算するようにする宣言です。参考までに一緒に測定しました。 これがないと、JVMによって計算結果が変わるとか、厳密でなくなるみたいです。
結論
double型に比べてBigDecimalを使うと速度が半分少しぐらいになります。
精度と処理速度をとるかはJavaではトレードオフになります。