☕JAVA/🔎 공부 [JAVA]

[JAVA] BigDecimal 과 사칙연산

디카페인라떼 2022. 9. 14. 19:48

이케아 클론코딩 프로젝트에서 장바구니 파트를 맡았다. 필연적으로 돈 계산이 들어가는 부분인데

이때 배송비 / 총 금액 등을 그냥 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