Javaで四則演算(足し算、引き算、掛け算、割り算)を行う際にはBigDecimalというクラスを使うのですが、Java9以降はBigDecimal.ROUND~関連が非推奨になったのでこれらを使わない方法を紹介していきます。
四則演算
BigDecimalの四則演算を行うメソッド
| 四則演算 | メソッド | |
|---|---|---|
| 足し算 | add | |
| 引き算 | subtract | |
| 掛け算 | multiply | |
| 割り算 | divide | 
BigDecimal one = BigDecimal.valueOf(1);
BigDecimal two = BigDecimal.valueOf(2);
BigDecimal value = one.add(two);
        
System.out.println(value);  // → 3
BigDecimal ten = BigDecimal.valueOf(10); // BigDecimal.TEN;
BigDecimal two = BigDecimal.valueOf(2);
BigDecimal value = ten.subtract(two);
        
System.out.println(value);  // → 8
BigDecimal two = BigDecimal.valueOf(2);
BigDecimal five = BigDecimal.valueOf(5);
BigDecimal value = two.multiply(five);
        
System.out.println(value);  // → 10
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 | 正の無限大に近づくように丸めるモードです | 
| DOWN | 0 に近づくように丸めるモードです | 
| FLOOR | 負の無限大に近づくように丸めるモードです | 
| HALF_DOWN | 「もっとも近い数字」に丸めるモードです(五捨六入) | 
| HALF_EVEN | 「もっとも近い数字」に丸める丸めモードです(末尾が偶数のほうに丸める) | 
| HALF_UP | 「もっとも近い数字」に丸めるモードです(四捨五入) | 
| UNNECESSARY | 要求される演算の結果が正確であり、丸め不要のモードです | 
| UP | 0 から離れるように丸めるモードです | 
サンプルコード
// 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


