デデン!突然ですが問題です!
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メソッドなどを用いて四則演算を行います。
これで誤差のない計算を行うことができます。