Java BigDecimalについて
開発業務でjavaを使う場面は多いと思います。計算ロジックを組む場合はBigDecimalを使うこともあるかと思います。
ふと、通常の整数とは違った型なので戸惑うこともあり記事に残すことにしました。
BigDecimalとは
https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html > oracle.docsより
いや、数学的なこと言われてもあんまりよくわからん。。。なので、つまりは・・・
floatやdoubleでは誤差が生じてしまう計算の場合に、意図しない結果を得てしまうことがあります。
例えば
double result = 10d / 6d;
System.out.println(result)
// 出力 1.6666666666666666666666666666666666666666
みたいな感じです。
ご存じの型もいるかと思いますが、「銀行丸め」の計算をしたい場合は上記の例では不規則過ぎて困ってしまいます。
そこでBigDecimalが役に立ちます。いわゆる勘定系の計算によく使われます。
※銀行丸め
N桁で丸める場合
第N桁が偶数なら 5以下は切り捨て。それ以外は切り上げ。
第N桁が奇数なら 5未満は切り捨て。それ以外は切り上げ。 というものです。
BigDecimalは通常の数の計算とは違い以下のように計算します。
// BigDecimal型の1000をint型の100で割る場合
BigDecimal bigNum = BigDecimal.valueOf(1000);
BigDecimal result = bigNum.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN);
System.out.println(result);
divideの用に特殊なメソッドを使います。通常の/は使えません。
詳しくはoracle.docsを参照ください。
0との比較をする場合
条件分岐などでBigDecimalの0はどう扱うのか。これも慣れていないとハマります。私も初心者なのでもちろんハマりました。
if(比較する値.compareTo(BigDecimal.ZERO) == 0) {
// ・・・
}
のようになります。つまり0と比べて差がないから0!という比較になります。
ちなみに0以上や0以下の場合は
ZeroCompare.java
if(比較する値.compareTo(BigDecimal.ZERO) > 0) {
// ・・・
}
のようにします。
まとめ
BigDecimalはプリミティブ型とは使い方が異なる。ということを意識しておくことが必要です。特に私のようなjava初心者は実際の開発業務でうっかり正確な計算をしないといけないのにfloatやdoubleを使ってやっちまったり、BigDecimalを間違った使い方にしてコンパイルエラーを起こしまくったりするのはなんともやってはいけないことです。普段はあんまり気にしないかもしれませんが、仕事の場合はよく心がけて開発する計算ロジックの目的や求める精度などはしっかりとヒアリングしてから開発に当たりたいと思います【反省】