Free Lines Arrow
본문 바로가기
Language/Java

[Java] BigDecimal

by skahn1215 2021. 12. 11.
728x90
반응형

BigDecimal

 

BigDecimal 을 사용하는 이유

  • java 에서 숫자를 정밀하게 표현하기 위해 사용이 된다.
  • 큰 소수점이나 큰 액수를 다룰때 선택이 아닌 필수로 사용해야 되는걸 기억하자.
  • 내부 코드를 보면 계산을 하기 위해 직접 만든 수식들을 사용한다.
  • 정수 * 10-scale 로 표현한다.

 

BigDecimal 의 용어

  • unscaled value: 정수를 그대로 표현한다.
  • scale: 지수 소수점의 자리수를 표현한다.
  • precision: 정수의 자릿수를 표현한다.

 

BigDecimal 생성하기

  • import java.math.*; 를 해줘야지 사용할수 있다.
  • unscaledValue
     - scale 값을 없앤 정수만 가져온다.
  • scale
     - scale 값을 가져온다.
  • precision
     - 정수의 자릿수를 가져온다.
BigDecimal val = new BigDecimal("123.45");
System.out.println("Unscaled Value: " + val.unscaledValue());
System.out.println("Scale: " + val.scale());
System.out.println("Precision: " + val.precision());

결과

Unscaled Value: 12345
Scale: 2
Precision: 5

 

BigDecimal 의 연산

  • add
  • subtract
  • multiply
  • divide
  • remainder
BigDecimal valueA = new BigDecimal("4.4");
BigDecimal valueB = new BigDecimal("2.2");
        
BigDecimal addValue = valueA.add(valueB);
System.out.println("add: "+addValue);
 
BigDecimal subtractValue = valueA.subtract(valueB);
System.out.println("subtract: "+subtractValue);
        
BigDecimal multiplyValue = valueA.multiply(valueB);
System.out.println("multiply: "+multiplyValue);
        
BigDecimal divideValue = valueA.divide(valueB);
System.out.println("divide: "+divideValue);
        
BigDecimal remainderValue = valueA.remainder(valueB);
System.out.println("remainder: "+remainderValue);

결과

add: 6.6
subtract: 2.2
multiply: 9.68
divide: 2
remainder: 0.0

 

 

BigDecimal의 주의점

  • 앞서 double 의 문제 점을 알아봤다
  • 그렇다면 BigDecimal double 값을 그대로 넣으면 문제가 된다.
  • String 으로 넣거나, double을 String.valueOf을 사용하여 String 으로 변환해 준다.

문제코드

BigDecimal valueA = new BigDecimal(12.1111111111111125);
BigDecimal valueB = new BigDecimal(2);
    
BigDecimal multiplyValue = valueA.multiply(valueB);
System.out.println(multiplyValue);

결과

24.2222222222222249854439724003896117210388183593750

 

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] String to LocalDateTime  (0) 2022.02.12
[Java] Double의 제한사항  (0) 2021.12.11
[Java] Generic Type Erasure  (0) 2021.10.29
[Java] HashMap, hashCode(), equals()  (0) 2021.09.06
[Java] getter 와 setter  (0) 2021.09.05

댓글