본문으로 건너뛰기

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)이런식으로 만들어야 한다.