부동소수점 표현 문제

부동소수점 표현 문제

PostgreSQL에서 double형을 Java로 넘겨줄 때, 아래와 같은 문제가 발생했다.

1.03 - 0.42 ==> output : 0.6100000000000001

PostgreSQL에서는 정확한 0.61로 표현이 되었으나, Java에서만 해당 문제가 계속 발생했다.
반올림, 올림을 해도 동일했다. 이유는 double형은 부동소수점을 이용하여 근사치를 표현하기 때문에 정확한 연산을 할 수 없다고 한다.
정확하게 소수점을 표현하고 싶다면 PostgreSQL의 numeric으로 형변환을 하거나, Java에서 BigDecimal로 받아야 한다.

PostgreSQL의 doc에서도 해당 내용을 확인할 수 있다.

Name Storage Size Description Range
double precision 8 bytes variable-precision, inexact 15 decimal digits precision
decimal variable user-specified precision, exact up to 131072 digits before the decimal point ; up to 16383 digits after the
numeric variable user-specified precision, exact up to 131072 digits before the decimal point ; up to 16383 digits after the decimal point


참고문서