Java BigDecimal 足し算, 引き算, 掛け算, 割り算そして四捨五入する方法

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_UP0 から離れるように丸めるモード

では、試してみましょう。

// 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 ってめっちゃ扱いづらいです。でも何年か使っていれば慣れてしまいます。私はもうすっかり慣れました^^

皆さんもきっちり仕様を抑えて、厳密な計算にチャレンジしてみてください。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。