Java BigDecimal 足し算, 引き算, 掛け算, 割り算そして四捨五入する方法
Java BigDecimalで足し算, 引き算, 掛け算, 割り算そして四捨五入する方法です。
Java を使って浮動小数を計算する場合、BigDecimal クラスを利用しましょう。
float 型 や double 型では、誤差が出る可能性があります!
実務の中で厳密なお金の計算をする場合、特に外貨などを扱う必要が場合は、BigDecimal クラスは必須です。
普通の計算の仕方と違うので、慣れるまで難しいと思うかもしれません。でも厳密な計算をするためには必要ですので、がんばりましょう。
ここでは Java BigDecimalで足し算, 引き算, 掛け算, 割り算そして四捨五入する方法 を紹介します。
BigDecimalとは
BigDecimal は任意の長さの 10 進数の表現と、その操作を行うことができるクラスです。
整数部とスケールの組み合わせで 10 進数 を表現します。
スケールとは小数点以下の桁数のこと
API ドキュメント
BigDecimal (Java Platform SE 6)
BigDecimal 四則演算
BigDecimal は、四則演算に対応する計算メソッドが用意されています。
四則演算 | メソッド |
---|---|
足し算 | add() |
引き算 | subtract() |
掛け算 | multiply() |
割り算 | divide() |
では、早速試してみましょう。
// BigDecimalの生成
BigDecimal one = new BigDecimal("1.00");
BigDecimal two = new BigDecimal("2.00");
BigDecimal three = new BigDecimal("3.00");
// 足し算 ( 1.0 + 2.0 )
BigDecimal add = one.add(two);
// 引き算 ( 1.0 - 2.0)
BigDecimal subtract = one.subtract(two);
// 掛け算 ( 2.0 * 3.0 )
BigDecimal multiply = two.multiply(three);
// 割り算 ( 1.0 / 3.0 少数第3位で四捨五入する )
BigDecimal divide = one.divide(three, 2, BigDecimal.ROUND_HALF_UP);
System.out.println("足し算: " + add);
System.out.println("引き算: " + subtract);
System.out.println("掛け算: " + multiply);
System.out.println("割り算: " + divide);
BigDecimal divide = one.divide(three);
この場合、丸めの設定をしないと無限小数となり、ArithmeticException
が発生します。
結果は以下の通りです。
足し算: 3.00
引き算: -1.00
掛け算: 6.0000
割り算: 0.33
丸め方法
BigDecimal では、四捨五入や切り捨て、切り上げ含めて以下のような丸め方法が用意されています。
計算メソッドで丸めを指定する以外にも、コンストラクション時に丸めの指定ができます。
丸め方法 | 説明 |
---|---|
ROUND_CEILING | 正の無限大に近づくように丸めるモード |
ROUND_DOWN | ゼロに近づくように丸めるモード |
ROUND_FLOOR | 負の無限大に近づくように丸めるモード |
ROUND_HALF_DOWN | 五捨六入する |
ROUND_HALF_EVEN | 末尾が偶数のほうに丸める |
ROUND_HALF_UP | 四捨五入する |
ROUND_UNNECESSARY | 丸め不要 |
ROUND_UP | 0 から離れるように丸めるモード |
では、試してみましょう。
// BigDecimalの生成
BigDecimal value = new BigDecimal(123.455);
BigDecimal roundCeling = value.setScale(2, BigDecimal.ROUND_CEILING);
BigDecimal roundDown = value.setScale(2, BigDecimal.ROUND_DOWN);
BigDecimal roundFloor = value.setScale(2, BigDecimal.ROUND_FLOOR);
BigDecimal roundHalfDown = value.setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal roundHalfEven = value.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal roundUp = value.setScale(2, BigDecimal.ROUND_UP);
System.out.println("ROUND_CEILING: " + roundCeling);
System.out.println("ROUND_DOWN :" + roundDown);
System.out.println("ROUND_FLOOR :" + roundFloor);
System.out.println("ROUND_HALF_DOWN :" + roundHalfDown);
System.out.println("ROUND_HALF_UP :" + roundHalfEven);
System.out.println("ROUND_UP :" + roundUp);
結果は以下の通りです。
ROUND_CEILING: 123.46
ROUND_DOWN :123.45
ROUND_FLOOR :123.45
ROUND_HALF_DOWN :123.45
ROUND_HALF_UP :123.45
ROUND_UP :123.46
他にも以下のようなメソッドが用意されています。
メソッド | 説明 |
---|---|
intValue() | BigDecimal 値を int 型で返します |
longValue() | BigDecimal 値を long 型で返します |
floatValue() | BigDecimal 値を float 型で返します |
doubleValue() | BigDecimal 値を double 型で返します |
signum() | BigDecimal 値の符号を返します。負値: -1, ゼロ: 0, 正値: 1 |
max(BigDecimal a) | a の値と比較して大きいほうを返します |
min(BigDecimal a) | a の値と比較して小さいほうを返します |
まとめ
Java BigDecimalで足し算, 引き算, 掛け算, 割り算そして四捨五入する方法を紹介しました。
ぶっちゃけ Java BigDecimal ってめっちゃ扱いづらいです。でも何年か使っていれば慣れてしまいます。私はもうすっかり慣れました^^
皆さんもきっちり仕様を抑えて、厳密な計算にチャレンジしてみてください。
おつかれさまでした。