デデン!突然ですが問題です!
3.3 / 1.1はいくつでしょう?
そう、3 です。
データ型を意識すれば 3.0 です。
しかしプログラムで計算してみるとなんと 2.9999999999999996 と出てきます。
実はdoubleやfloatの計算では誤差が出てしまう場合があります。
大幅にズレることはないのですが、お金の計算など勘定系のシステムにおいては致命的です。
この誤差を出さないようにするためにはjava.math.BigDecimalクラスを使用して計算を行います。
サンプルで確認してみます。
import java.math.BigDecimal;
public class BigDecimalSample {
public static void main(String[] args) {
// doubleで計算
double doubleAnswer = 3.3 / 1.1;
System.out.println("double : " + doubleAnswer);
// BigDecimalで計算
BigDecimal val1 = BigDecimal.valueOf(3.3);
BigDecimal val2 = BigDecimal.valueOf(1.1);
BigDecimal bigDecimalAnswer = val1.divide(val2);
System.out.println("BigDecimal : " + bigDecimalAnswer);
}
}
【実行結果】
double : 2.9999999999999996
BigDecimal : 3
BigDecimalクラスにはvalueOfメソッドがあり、これで基本データ型の値を取り込みます。
他にもONE、TEN、ZEROなどの定数も用意されています。
そしてaddメソッド、subtractメソッド、multiplyメソッド、divideメソッドなどを用いて四則演算を行います。
これで誤差のない計算を行うことができます。