아래 코드를 실행시키면 아래와 같이 의도하지 않은 결과가 발생합니다.
정수 끼리의 연산에서는 나누기를 제외하면 부동 소수 오류가 발생하지 않습니다.
0.1 + 0.2 = 0.30000000000000004
0.45 - (0.3 + 0.15) = 5.551115123125783E-17
1300.0 * (700.0 / 4000.0) = 227.49999999999997
8366.8 * 58 = 485274.39999999997
58332.4 + 68772.9 + 105771.8 = 232877.09999999998
똑같은 연산을 oracle db 에서 실행하면 발생하지 않습니다.
javascript 라이브러리 중에 big.js 라는 수학 연산 라이브러리가 있는데 java 의 bigdecimal 과 유사하게 사용할 수 있습니다.
big.js 를 사용하여 부동 소수 오류를 방지할 수 있습니다.
하지만 일반적인 수 연산이 아닌 메써드 호출로 연산자를 대신해야 하는 불편함이 있습니다.
예제)
var result = +Big(0.1).plus(0.2);
(javascript 에서 + 기호를 변수 등에 붙이면 숫자로 변환됩니다.)
java 에서도 BigDecimal 를 사용하면 부동소수오류를 피할 수 있습니다.
단, 결과로 받을 값의 소숫점이하 자릿수에 따라 BigDecimal 생성할 때 arguments 를 잘 주어야 합니다.
groovy 에서는 일반 연산자를 사용하여 BigDecimal 연산을 할 수 있습니다.
groovy 에서는 일반 연산자를 사용하여 BigDecimal 연산을 할 수 있습니다.
댓글 없음:
댓글 쓰기