【Java】BigDecimalとint型

はじめに

int型で実装していたのですが、途中で小数も扱うということになり、泣く泣くBigDecimal型に変更。
そのときに使用したBigDecimalクラスのあれこれを書いていきます。

BIGDECIMALクラスとは

用語 説明
精度 整数部分
スケール 小数点以下の桁

この2つを保持しており、正確な計算を提供してくれます。

なぜBIGDECIMALなのか

doubleやlongなどでは、小数部分が勝手に丸まってしまうなど 意図しない計算が起こってしまうようです。 私の場合は、小数点を使用した厳密な計算を行う必要があったのでBigDecimalを採用しました。
参考:なぜBigDecimalを使わなければならないのか | Java好き

INT型をBIGDECIMAL型に変換したい

変換の方法は2つあります。

int a = 1; 
① BigDecimal bd = new BigDecimal(a);
② BigDecimal bd = BigDecimal.valueOf(a);   


INT型のように初期値を0にしたい

BigDecimal db = BigDecimal.ZERO;

BigDecimal.ZEROはスケールが0の値0を戻します。
他にも
BigDecimal.ONE
BigDecimal.TEN
などのフィールドが用意されています。

足し算や引き算、掛け算もしたい

算術 メソッド
足し算 add(BigDecimal augend)
引き算 subtract(BigDecimal subtrahend)
掛け算 multiply(BigDecimal multiplicand)
割り算 divide(BigDecimal divisor)


計算結果の小数点を丸めたい

BigDecimalの算術では、結果の小数点の表記や丸める方法も指定できるので便利です。
割り算で用いられる以下のメソッドで考えてみます。
divide(BigDecimal divisor, int scale, int roundingMode);

パラメータ 説明
divisror 割る値
scale 小数点第何位まで表示するか(スケールの値)
roundingMode 丸め方

スケール値

BigDecimal divisor = 3;
BigDecimal dividend = 5;
BigDecimal amount = BigDecimal.ZERO;

amount = divisor.devide(dividend,0,ROUND_DOWN);
 //⇒ amount = 1
amount = divisor.devide(dividend,2,ROUND_DOWN);
 //⇒ amount = 1.66

丸め方

BigDecimal divisor = 3;
BigDecimal dividend = 5;
BigDecimal amount = BigDecimal.ZERO;

amount = divisor.devide(dividend,2,ROUND_DOWN);//切り捨て
 //⇒ amount = 1.66
amount = divisor.devide(dividend,2,ROUND_UP);//切り上げ
 //⇒ amount = 1.67

丸め方には他にも様々な方法があるようです。
参考:RoundingMode (Java Platform SE 8)

おわりに

文系出身だからか、小数点を含む計算はちょっと避けたい部分だったのですが、調べてみると意外におもしろかったです。