BigDecimal소수점 자릿수 주의사항
빅데시멀에서 new BigDecimal()방식이 아닌 BigDecimal.ZERO 같은 방식으로 0을 만들수가 있는데 주의사항이 있어서 적어본다.
코드
public class Exercise {
public static void main(String[] args) {
BigDecimal bigDecimalA = BigDecimal.ZERO;
// 0인 0
BigDecimal bigDecimalB = new BigDecimal("0");
// 0.00인 0
BigDecimal bigDecimalC = new BigDecimal("0.00");
// BigDecimal.ZERO를 0.00인 0으로 소수점 자릿수 표현을 바꿔봄
BigDecimal bigDecimalD = bigDecimalA.setScale(2);
// 0인 0을 0.00인 0으로 소수점 자릿수 표현을 바꿔봄
BigDecimal bigDecimalE = bigDecimalB.setScale(2);
// BigDecimal.ZERO로 만들때 소수점 자릿수를 지정해줌
BigDecimal bigDecimalX = BigDecimal.ZERO.setScale(3);
BigDecimal bigDecimalY = new BigDecimal("0.000");
System.out.println("BigDecimal.ZERO와 new BigDecimal(\"0\") 의 비교 : " + bigDecimalA.equals(bigDecimalB));
System.out.println("BigDecimal.ZERO와 new BigDecimal(\"0.00\") 의 비교 : " + bigDecimalA.equals(bigDecimalC));
System.out.println("BigDecimal.ZERO를 소수점 2자리 0.00으로 변경한것 과 new BigDecimal(\"0.00\") 의 비교 : " + bigDecimalC.equals(bigDecimalD));
System.out.println("0인 0을 0.00인 0으로 소수점 자릿수를 변경한것 과 new BigDecimal(\"0.00\") 의 비교 : " + bigDecimalC.equals(bigDecimalE));
System.out.println("BigDecimal.ZERO.setScale(3) 과 new BigDecimal(\"0.000\") 의 비교 : " + bigDecimalX.equals(bigDecimalY));
}
결과
BigDecimal.ZERO와 new BigDecimal("0") 의 비교 : true
BigDecimal.ZERO와 new BigDecimal("0.00") 의 비교 : false
BigDecimal.ZERO를 소수점 2자리 0.00으로 변경한것 과 new BigDecimal("0.00") 의 비교 : true
0인 0을 0.00인 0으로 소수점 자릿수를 변경한것 과 new BigDecimal("0.00") 의 비교 : true
BigDecimal.ZERO.setScale(3) 과 new BigDecimal("0.000") 의 비교 : true
결론
BigDecimal.ZERO 나 new BigDecimal("0")은 같으나, BigDecimal.ZERO / new BigDecimal("0.00")은 같지 않다.
빅데시멀 에서는 소수점 자릿수표현이 일치하지 않으면 같지 않다고 판정된다. BigDecimal.ZERO.setScale(2)이런식으로 만들어야 한다.