Java/정리

[Java] double 계산오차

콧등치기국수 2021. 6. 23. 23:10

1. 문제상황(코드)

아래 코드를 보면 각 사원의 연봉을 사용자로부터 입력받고 그 값에 inArr에 있는 double값인 인센티브를 곱해서 salary를 구한다.

C사원의 인센티브 포함 연봉을 구하기 위해서 double형 값인 2600에 double형 값인 0.15를 곱하여 salary를 구했는데, 2989.9999999999995 라는 이상한 실수가 나왔다!!

 

2. 원인

자바에서 실수인 float과 double은 부동소수점 방식으로 저장이 되는데, 이때 근사값으로 저장이 된다.

부동 소수점 방식(Floating-Point Number Representation)은 실수를 부호부(sign), 가수부(Mantissa) 그리고 지수부(Exponent)로 나눈다. 그리고 나눠진 부호부, 가수부, 지수부는 각각 이진수로 저장이 된다. 

 

부호부, 가수부, 지수부로 각각 저장이 될 때 소수점 아래 부분을 이진화 시 딱 떨어지지 않을 경우 무한소수가 되어 가수부의 용량(float : 23bit / double : 52bit)까지만 값을 저장하기 때문에 여기서 1차적으로 오차가 발생한다.또한 부동소수점 방식으로 저장된 값을 실제값으로 변환할때에도 2차적으로 오차가 발생할 수 있다. 

 

즉 실수는 근사값으로 저장되기 때문에 위와 같이 오차가 발생할 수 있다!

 

 

 

 

 

* 출처 및 참고: https://madplay.github.io/post/the-need-for-bigdecimal-in-java