Numbers
BigDecimal: equals と compareTo は scale の扱いが違う
1.0 と 1.00 は数値として同じでも、equals では scale の違いにより等しくありません。
SourceBigDecimalComparison.java
Java 21
package examples.bigdecimal;
import java.math.BigDecimal;
public final class BigDecimalComparison {
private BigDecimalComparison() {}
public static boolean equalsValueAndScale(BigDecimal left, BigDecimal right) {
return left.equals(right);
}
public static boolean hasSameNumericValue(BigDecimal left, BigDecimal right) {
return left.compareTo(right) == 0;
}
}TestBigDecimalComparisonTest.java
Java 21
package examples.bigdecimal;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.math.BigDecimal;
import org.junit.jupiter.api.Test;
class BigDecimalComparisonTest {
@Test
void scaleが異なるBigDecimalはequalsで等しくない() {
assertFalse(
BigDecimalComparison.equalsValueAndScale(new BigDecimal("1.0"), new BigDecimal("1.00")));
}
@Test
void scaleが異なっても数値として同じBigDecimalはcompareToで等しい() {
assertTrue(
BigDecimalComparison.hasSameNumericValue(new BigDecimal("1.0"), new BigDecimal("1.00")));
}
}01Assertion
このテストで確認できること
- 1.0 と 1.00 は equals では false になる
- 同じ二値を compareTo すると 0 になる
BigDecimal.equals は数値だけでなく scale も比較します。数値としての大小・同値比較には compareTo を使います。
OBSERVED RESULT
expected: equals → false
actual: false
expected: compareTo → 0
actual: 0