[JAVA] JAVA Double 소수점 반올림 오차 (java double 0.1의 정확도)
in Java on Java
결제 시스템이 변경되어 열심히 개발하는 중.
수수료가 1원씩 차이가 나는 경우가 발생했다.
회사마다 다르겠지만. 0.3원을 청구할 순 없으니 소수점 이하는 버리도록 개발을 하였다.
문제는 이 버리는 로직에서 발생하였다.
카드사와 수수료가 1원씩 차이는 데이터가 발생하였다고 확인해 보니
카드사에서는 3,772원의 수수료가. 우리에게는 3,771원으로 등록되어있어 발생한 것을 확인.
해당 주문은 82,000원에 수수료 4.6%로 계산기를 두드려보니 3,772원이 맞았다.
무엇이 문제인지 확인해 보니 전임자가 수수료 계산을 double 자료형으로 해놨었다.
구글링을 해보니
Java Double value = 0.01 changes to 0.009999999999999787 라는 StackOverflow 글을 발견.
- 소수점 정밀도에 있어 문제가 있는 double로 소수점을 계산하다 보니 0.000000006원 정도의 차이가 발생했고 소수점을 절삭하는 바람에 1원이 누락된 것.*
해결책
1.BigDecimal 사용
정확한 숫자 계산을 위해서는 BigDecimal을 사용해야 한다는 깨달음을 다시 얻고 문제 해결.