본문으로 바로가기

[Java] 수치 정밀하게 표현하기 BigDecimal

category Java 2019. 10. 16. 23:37

자바에서 금액이나 소수점 같이 정밀한 수의 표현을 위해서 BigDecimal 을 사용 할 수 있습니다.

 

종류 유형 범위
정수형 byte -128 ~ 127
short -32768 ~ 32767
int -2147483648 ~ 2147483647
long -9223372036854775808 ~ 9223372036854775807
실수형 float 1.4E-45 ~ 3.4028235E38
double 4.9E-324 ~ 1.7976931348623157E308

기본적인 데이터 타입

 

 


BigDecimal


 

기본적인 사용법은 아래와 같다.

BigDecimal a = new BigDecimal("214");
BigDecimal b = new BigDecimal("0.031");

System.out.println("BigDecimal : " + a + " int : " + b);

//BigDecimal : 214 int : 0.031

 

BigDecimal 의 연산


BigDecimal a = new BigDecimal("214");
BigDecimal b = new BigDecimal("2");

System.out.println("a + b : " + a.add(b));
System.out.println("a - b : " + a.subtract(b));
System.out.println("a * b : " + a.multiply(b));
System.out.println("a / b : " + a.divide(b));

// a + b : 216
// a - b : 212
// a * b : 428
// a / b : 107



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

System.out.println("a / b : " + a.divide(b));
//Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

System.out.println("a / b : " + a.divide(b,RoundingMode.HALF_EVEN));
//71

System.out.println("a / b : " + a.divide(b,6,RoundingMode.HALF_EVEN));
//71.333333

 

BigDecimal 은 오브젝트 이기때문에 일반적인 변수처럼 +-*/ 를 이용하여 연산하지 못한다.

 

그리고 나머지가 무한대로 떨어지는 수의 나눗샘 같은 경우는 오류를 내는데, 

 

divede 함수의 두번쨰, 세번쨰 인자로 반올림을 어떻게 할것인지, 몇번쨰 자리수에서 할것인지 정할 수 있다.

반올림 유형

 

 

BigDecimal 의 비교


BigDecimal a = new BigDecimal("214");
BigDecimal b = new BigDecimal("2");

System.out.println("a == b : " + a.equals(b));
System.out.println("a > b = 1, a < b = 2, a == b = 0 : " + a.compareTo(b));
    
// a == b : false
// a > b = 1, a < b = 2, a == b = 0 : 1

BigDecimal 의 비교는 equals와 compareTo 를 이용해 할 수 있다.

 

 

그 외로 절대값, 최소값, 최대값 등을 구할수 있는 함수가 있다.

BigDecimal a = new BigDecimal("214");
BigDecimal b = new BigDecimal("-2");

System.out.println("max : " + a.max(b));
System.out.println("min : " + a.min(b));
System.out.println("abs : " + b.abs());

// max : 214
// min : -2
// abs : 2



System.out.println("0 : " + BigDecimal.ZERO);
System.out.println("1 : " + BigDecimal.ONE);
System.out.println("10 : " + BigDecimal.TEN);

// 0
// 1
// 10

 

int형을 BigDecimal 로 변환하는방법과 BigDecimal 을 int 타입으로 변환하는 방법.

BigDecimal a = new BigDecimal("214");
int b = 123;
BigDecimal c = new BigDecimal("214.123");

System.out.println(a.intValue());
System.out.println(new BigDecimal(b));
System.out.println(c.intValue());

//214
//123
//214

변환시 소수점은 버려진다.