티끌모아부자

[java] BigDecimal 연산과 비교 본문

IT-JAVA/JAVA

[java] BigDecimal 연산과 비교

실천합시다 2017. 3. 21. 10:58

java에서는 부동소수점 연산시 부정확성때문에 정확한 실수 계산을 위해 BigDecimal을 지원한다.

비록 performance는 double,float등 보다 떨어지지만 프로그램 성격에 따라 

정확한 부동소수점 연산이 필요하다면 BigDecimal을 사용한다.


Float과 BigDecimal 연산 Sample코드와 결과를 확인해보자.


java


실행결과


첫 번째로 float의 덧셈연산을 살펴보자.

소수점 7자리에서 계속에서 오차가 누적되는 것을 볼 수 있다. 


두 번째로 BigDecimal이지만 객체 생성시 숫자를 입력하여 생성하였다.

대략 소수점 16~17번째 자리에서 눈에 띄게 오차가 발생한다.


세 번째로 BigDecimal 선언시 String형태로 선언하여주었다.

오차없이 정확한 연산을 지원하는 것을 볼 수 있다.


네 번째로 String형태로 선언한 BigDecimal, 숫자형태로 선언한 BigDecimal을 더하면?

더하는 BigDecimal이 부정확한 숫자여서 오차가 누적되는 것을 볼 수 있다.


정리

결과적으로 BigDecimal 연산에서는 숫자형태로 초기화하는 것이 아니라 String형태로 초기화하는 것이 정확한 연산을 할 수 있다.

BigDecimal을 쓰는 목적이 부동소수점 오차를 발생시키지 않기 위함이므로 BigDecimal 사용시 주의하는 것이 좋을 것 같다.




그렇다면 BigDecimal의 비교방법은 어떻게 될까?

1. ==

2. equals

3. compareTo


어느정도 예상이 되는 결과이지만 다시 한번 환기를 해보면.....!


java


실행결과



정리
1. 단적으로 int만 보면 경우엔 등호로 값비교가 가능하지만 BigDecimal은 안된다. 
2. 단순하게 값이 같은지만 보려면 equals를 사용해서 비교할 수 있다.
3. 만약 값의 크고 작음을 보려면 compareTo를 사용해서 값 비교한다. 
- compareTo에 들어가는 변수값이 더 작을 경우 : 1
- compareTo에 들어가는 변수값이 더 클 경우    : -1
- compareTo에 들어가는 변수값과 동일할 경우  : 0





Comments