이케아 클론코딩 프로젝트에서 장바구니 파트를 맡았다. 필연적으로 돈 계산이 들어가는 부분인데
이때 배송비 / 총 금액 등을 그냥 int로 사용하면 안되고 BigDecimal을 사용해야한다고 알게되었다.
BigDecimal 이란?
- Java 언어에서 숫자를 정밀하게 저장하고 표현할 수 있는 유일한 방법
- double : 소수점을 저장할 수 있고 크키가 가장 큰 타입. 소수점의 정밀도에 있어 한계
- Java 언어에서 돈과 소수점을 다운다면 BigDecimal은 필수
- 단점은 느린 속도와 기본 타입보다 불편한 사용법..
BigDecimal 기본상수
- 자주 쓰는 0, 1, 100은 쓰기 편하게 미리 상수로 정의되어 있음
// 흔히 쓰이는 값은 상수로 정의
// 0
BigDecimal.ZERO
// 1
BigDecimal.ONE
// 10
BigDecimal.TEN
int 값 -> BigDecimal
BigDecimal seq = new BigDecimal(int 값);
사칙연산 (더하기 빼기 곱하기 나누기)
BigDecimal number1 = new BigDecimal("250.125");
BigDecimal number2 = new BigDecimal("150.352");
System.out.println("더하기 : " + number1.add(number2));
System.out.println("빼기 : " + number1.subtract(number2));
System.out.println("곱하기 : " + number1.multiply(number2));
System.out.println("나누기 : " + number1.divide(number2));
//결과
더하기 : 400.477
빼기 : 99.773
곱하기 : 37606.794000
// 나누기 는 에러가 남
- 나누기는 다음과 같이 소수점 처리를 해주어야 한다.
BigDecimal number1 = new BigDecimal("250.125");
BigDecimal number2 = new BigDecimal("150.352");
System.out.println("나누기 : " + number1.divide(number2, BigDecimal.ROUND_UP));
System.out.println("나누기 : " + number1.divide(number2, BigDecimal.ROUND_DOWN));
System.out.println("나누기 : " + number1.divide(number2, BigDecimal.ROUND_HALF_UP));
System.out.println("나누기 : " + number1.divide(number2, BigDecimal.ROUND_HALF_DOWN));
System.out.println("나누기 : " + number1.divide(number2, 4, BigDecimal.ROUND_UP));
System.out.println("나누기 : " + number1.divide(number2, 4, BigDecimal.ROUND_DOWN));
System.out.println("나누기 : " + number1.divide(number2, 4, BigDecimal.ROUND_HALF_UP));
System.out.println("나누기 : " + number1.divide(number2, 4, BigDecimal.ROUND_HALF_DOWN));
- 소수점 처리 방법
- BigDecimal.ROUND_UP : 올림
- BigDecimal.ROUND_DOWN : 버림
- BigDecimal.ROUND_HALF_UP : 반올림 ( 5 이상 올림)
- BigDecimal.ROUND_HALF_DOWN : 반내림 ( 5 이상 내림)
- divide 함수는 파라미터가 3개
- 첫번째 파라미터와 마지막 파라미터는 같지만 가운데 int 타입의 파라미터가 하나 더 있다.
- 이 파라미터의 역할은 스케일을 정하는 역할로 소수점 자리를 어디까지 표현할 것인가를 지정
비교연산
- compare To 함수 사용
- 🚨BigDecimal 타입 끼리만 비교 가능 => 다른 타입일 경우 BigDecimal로 형변환 하여 비교 해야 함
- 일반적인 비교 연산자 로는 비교할 수 없음!
System.out.println("비교 : " + number1.compareTo(BigDecimal.ZERO));
System.out.println("비교 : " + number1.compareTo(new BigDecimal("0")));
// 사용방법
if(number1.compareTo(new BigDecimal("0")) == 1){
// number1 이 0보다 클 경우
}
- BigDecimal 의 수치가 val 보다 작으면 -1
- BigDecimal 의 수치가 val 와 같으면 0
- BigDecimal 의 수치가 val 보다 크면 1
을 리턴한다.
소수점 처리
- 소수점을 내가 원하는 자리수만큼 표현해야 하는 경우가 있음
- setScale 함수를 이용
BigDecimal number1 = new BigDecimal("150.35");
System.out.println("소수점 올림 : " + number1.setScale(1, BigDecimal.ROUND_UP));
System.out.println("소수점 버림 : " + number1.setScale(1, BigDecimal.ROUND_DOWN));
System.out.println("소수점 5이상 올림(반올림): " + number1.setScale(1, BigDecimal.ROUND_HALF_UP));
System.out.println("소수점 5이하 내림(반내림): " + number1.setScale(1, BigDecimal.ROUND_HALF_DOWN));
//결과
소수점 올림 : 150.4
소수점 버림 : 150.3
소수점 5이상 올림(반올림): 150.4
소수점 5이하 내림(반내림): 150.3
'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글
[JAVA] Heap 모니터링 & Heap Dump 분석하기 (0) | 2022.10.26 |
---|---|
[JAVA] JVM의 구조 와 메모리 구조 (0) | 2022.10.26 |
[JAVA] List 중복 제거 (0) | 2022.09.01 |
[JAVA] 제네릭 Generic (0) | 2022.08.26 |
[JAVA] Map, HashMap (0) | 2022.08.24 |