float, double 타입과 다르게 BigDecimal 타입은 초기화가 기본 타입보다는 긴 편이다. 그래서, 자주 쓰는 0, 1, 100은 쓰기 편하게 미리 상수로 정의되어 있다.
// 0
BigDecimal.ZERO
// 1
BigDecimal.ONE
// 10
BigDecimal.TEN
double 타입으로 부터 BigDecimal 타입을 초기화하는 방법으로 가장 안전한 것은 문자열의 형태로 BigDecimal 생성자에 전달하는 것이다. double 타입 그대로 전달하는 경우 예상과 다른 결과를 얻을 수 있다.
// double 타입을 그대로 초기화하면 기대값과 다른 값을 가진다.
// 0.01000000000000000020816681711721685132943093776702880859375
// => 에러!!!
new BigDecimal(0.01);
// ==================== 문자열 전달 방법 =====================
// 문자열로 초기화하면 정상 인식
// 0.01
new BigDecimal("0.01");
// 0.01
new BigDecimal(String.valueOf(0.01));
// 0.01
BigDecimal.valueOf(0.01);
BigDecimal은 객체이기 때문에 동등 비교 연산을 할 때 주의해야 된다. 특히, double타입을 사용할 때와 마찬가지로 == 기호를 사용할 때 주의해야 된다.
BigDecimal a = new BigDecimal("13.08");
BigDecimal b = new BigDecimal("13.080");
// 객체를 비교할 때 사용, 두 객체가 동일한 객체가 아니므로 false 반환
// false
a == b;
// 자바에서 == 연산자를 사용한 비교는 두 객체가 동일한 객체인지를 비교하는데 사용
// 값의 비교를 위해 사용, 소수점 맨 끝의 0까지 완전히 같아야 true 반환
// false
a.equals(b);
// 값의 비교를 위해 사용, 소수점 맨 끝의 0을 무시하고 값이 같으면 0, 작으면 -1, 크면 1을 반환
// 0
a.compareTo(b);
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
// 더하기
// 13
a.add(b);
// 빼기
// 7
a.subtract(b);
// 곱하기
// 30
a.multiply(b);
// 나누기
// 3.333333...
a.divide(b);
// 나누기 (소수점 3자리까지 반환)
// 3.333
a.divide(b, 3, RoundingMode.HALF_EVEN);
// 절대값
// 3
new BigDecimal("-3").abs();
// 두 수 중 최소값
// 3
a.min(b);
// 두 수 중 최대값
// 10
a.max(b);