Numbers
BigDecimal: 除算の丸めモードで同じ式の結果が変わる
割り切れない除算は、scaleとRoundingModeを明示しなければ期待する桁と方向を固定できません。
SourceDecimalRounding.java
Java 21
package examples.bigdecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
public final class DecimalRounding {
private DecimalRounding() {}
public static BigDecimal divide(
BigDecimal dividend, BigDecimal divisor, RoundingMode roundingMode) {
return dividend.divide(divisor, 2, roundingMode);
}
}TestDecimalRoundingTest.java
Java 21
package examples.bigdecimal;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.math.BigDecimal;
import java.math.RoundingMode;
import org.junit.jupiter.api.Test;
class DecimalRoundingTest {
@Test
void BigDecimalの除算は指定した丸めモードで結果が変わる() {
var one = new BigDecimal("1");
var three = new BigDecimal("3");
assertEquals(new BigDecimal("0.33"), DecimalRounding.divide(one, three, RoundingMode.DOWN));
assertEquals(new BigDecimal("0.34"), DecimalRounding.divide(one, three, RoundingMode.UP));
}
}01Assertion
このテストで確認できること
- 1を3で割ると、RoundingMode.DOWNでは0.33になる
- 同じ除算でもRoundingMode.UPでは0.34になる
金額や比率の計算では、scaleだけでなく丸め方向も業務ルールです。暗黙の丸めにせず、RoundingModeをコードとテストで固定します。
OBSERVED RESULT
expected: 1 / 3 (DOWN) → 0.33
actual: 0.33
expected: 1 / 3 (UP) → 0.34
actual: 0.34