Back-End/Java

[Java/자바] BigDecimal 정리

728x90

https://www.acmicpc.net/problem/2720

 

2720번: 세탁소 사장 동혁

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

www.acmicpc.net

위의 문제를 풀다가 BigDecimal을 처음 사용해봤는데 잘 정리해두면 유용하게 쓰일 것 같아서 포스팅합니다!

 

BigDecimal?

- 자바에서 숫자를 정밀하게 저장하고 표현할 수 있는 객체입니다.

- 자바에서 소수는 정밀도의 한계로 인해 값이 유실되는 경우가 있는데, 그것을 방지할 수 있습니다.

- 단점은 느린 속도 & 복잡한 사용 방법을 제외하면 없습니다. (그만큼 좋음!)

 

BigDecimal 기본 상수

BigDecimal은 객체이기 때문에 초기화가 기본 타입보다는 긴 편입니다. 그래서 자주 사용하는 0, 1, 100은 쓰기 편하도록  상수로 정의되어 있습니다.

// 0
BigDecimal.ZERO 

// 1
BigDecimal.ONE

// 10
BigDecimal.TEN

 

BigDecimal 초기화

 double 타입을 가장 안전하게 BigDecimal을 이용해서 초기화하는 방법은 문자열 형태로 BigDecimal 생성자에게 전달하는 것입니다. double 타입 그대로 전달할 경우 예상과 다른 값을 얻을 수 있습니다. 

// double 타입 전달 -> 0.01000000000000000020816681711721685132943093776702880859375 에러!!
BigDecimal bc1 = new BigDecimal(0.01);

// 문자열 전달 방법
BigDecimal bc2 = new BigDecimal("0.01");
BigDecimal bc3 = new BigDecimal(String.valueOf(0.01));
BigDecimal bc4 = BigDecimal.valueOf(0.01);

 

BigDecimal 비교 연산

 BigDecimal은 객체이기 때문에 비교 연산을 사용할 때 조심해야 합니다. 특히 동등 비교 연산자(==)를 사용할 때 조심해야 합니다.

BigDecimal a = new BigDecimal("15.57");
BigDecimal b = new BigDecimal("15.570");

// false
a == b;

// 값 비교에 사용, 소수점 끝 0 까지 같아야 true를 리턴
// false
a.equals(b);

// 값 비교에 사용, 소수점 끝 0을 무시하고 값이 동일하면 0, 크면 1, 작으면 -1
// 0
a.compareTo(b);

 

BigDecimal 사칙 연산

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");

// 1. 더하기
a.add(b);

// 2. 빼기
a.substract(b);

// 3. 곱하기
a.multiply(b);

// 4. 나누기
a.divide(b);

// 5. 나머지
a.remainder(b);

// 절대값
new BigDecimal("-3").abs();

// 두 수 중 최소값
// 3
a.min(b);

// 두 수 중 최대값
// 10
a.max(b);

 

더 자세한 내용들이 많은데 아직 다 이해가 되지 않아서 이해한 부분만 간단하게 정리해 봤습니다!

내용은 계속해서 추가해 가려고 합니다.

728x90