Java9以降のBigDecimalで四則演算を行う方法

Javaで四則演算(足し算、引き算、掛け算、割り算)を行う際にはBigDecimalというクラスを使うのですが、Java9以降はBigDecimal.ROUND~関連が非推奨になったのでこれらを使わない方法を紹介していきます。

四則演算

BigDecimalの四則演算を行うメソッド

四則演算メソッド
足し算add
引き算subtract
掛け算multiply
割り算divide

足し算(add)

BigDecimal one = BigDecimal.valueOf(1);
BigDecimal two = BigDecimal.valueOf(2);

BigDecimal value = one.add(two);
        
System.out.println(value);  // → 3

引き算(subtract)

BigDecimal ten = BigDecimal.valueOf(10); // BigDecimal.TEN;
BigDecimal two = BigDecimal.valueOf(2);

BigDecimal value = ten.subtract(two);
        
System.out.println(value);  // → 8

掛け算(multiply)

BigDecimal two = BigDecimal.valueOf(2);
BigDecimal five = BigDecimal.valueOf(5);

BigDecimal value = two.multiply(five);
        
System.out.println(value);  // → 10

割り算(divide)

BigDecimal three = BigDecimal.valueOf(3);
BigDecimal ten = BigDecimal.valueOf(10);

BigDecimal value = ten.divide(three, 2, RoundingMode.HALF_UP);        
        
System.out.println(value);  // → 3.33

丸め処理について

Java9以前(Java8まで)の下記のような書き方はNGパターンになるので注意しましょう。

非推奨となった書き方と推奨の書き方

非推奨(NG)パターン BigDecimal.ROUND_~

BigDecimal bd1 = new BigDecimal("100");
BigDecimal bd2 = bd1.divide(3, 2, BigDecimal.ROUND_HALF_UP);

推奨(OK)パターン java.math.RoundingMode

Java9以降はRoundingModeクラスを使った書き方が標準となります。

BigDecimal bd1 = new BigDecimal("100");
BigDecimal bd2 = bd1.divide(3, 2, RoundingMode.HALF_UP);

小数部を破棄できる演算に対する「丸め動作」を処理する際にはRoundingModeクラスを使います。

RoundingModeクラスの定数

定数説明
CEILING正の無限大に近づくように丸めるモードです
DOWN0 に近づくように丸めるモードです
FLOOR負の無限大に近づくように丸めるモードです
HALF_DOWN「もっとも近い数字」に丸めるモードです(五捨六入)
HALF_EVEN「もっとも近い数字」に丸める丸めモードです(末尾が偶数のほうに丸める)
HALF_UP「もっとも近い数字」に丸めるモードです(四捨五入)
UNNECESSARY要求される演算の結果が正確であり、丸め不要のモードです
UP0 から離れるように丸めるモードです

サンプルコード

// BigDecimalの生成
BigDecimal value = BigDecimal.valueOf(123.4567);

// 正の無限大に近づくように丸めるモードです
BigDecimal valueCeiling = value.setScale(2, RoundingMode.CEILING);
System.out.println(valueCeiling);    // → 123.46

// ゼロに近づくように丸めるモード
BigDecimal valueDown = value.setScale(2, RoundingMode.DOWN);
System.out.println(valueDown);    // → 123.45

// 負の無限大に近づくように丸めるモード
BigDecimal valueFloor = value.setScale(2, RoundingMode.FLOOR);
System.out.println(valueFloor);    // → 123.45

// 五捨六入
BigDecimal valueHalfDown = value.setScale(2, RoundingMode.HALF_DOWN);
System.out.println(valueHalfDown);    // → 123.46

// 末尾が偶数のほうに丸める
BigDecimal valueHalfEven = value.setScale(2, RoundingMode.HALF_EVEN);
System.out.println(valueHalfEven);    // → 123.46

// 四捨五入
BigDecimal valueHalfUp = value.setScale(2, RoundingMode.HALF_UP);
System.out.println(valueHalfUp);    // → 123.46

// 0 から離れるように丸めるモード
BigDecimal valueUp = value.setScale(2, RoundingMode.UP);
System.out.println(valueUp);    // → 123.46

参考リンク

Java11 BigDecimal JavaDoc

https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/math/BigDecimal.html

Java11 RoundingMode JavaDoc

https://docs.oracle.com/javase/jp/6/api/java/math/RoundingMode.html

Leave a Reply

Your email address will not be published. Required fields are marked *