【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)
おわりに
文系出身だからか、小数点を含む計算はちょっと避けたい部分だったのですが、調べてみると意外におもしろかったです。