문서유형ㅣ기술 정보
분야ㅣApp 개발
적용제품버전ㅣTibero 6, Tibero 7
문서번호ㅣTDETS020
현상
수학적으로 동일한 수식이 ROUND 적용시 서로 다른 결과를 반환하는 현상을 다음과 같이 확인할 수 있습니다.
SQL> select round(8003/60*30,0) from dual ;
ROUND(8003/60*30,0)
-------------------
4001
SQL> select round(8003*30/60,0) from dual ;
ROUND(8003*30/60,0)
-------------------
4002
원인
연산 순서에 따라 최종 ROUND 결과 반환값이 틀려지는 현상입니다.
| 수식 | 중간 결과 | 최종 값 | ROUND |
|---|---|---|---|
8003/60*30 | 133.38333…333 | 4001.49999...999 | 4001 |
8003*30/60 | 24090 | 4001.5 | 4002 |
해결
민감한 데이터(금액·수량)의 경우 계산 결과가 틀려지기 때문에 다음과 같은 우회법 및 규칙을 지정하여 적용하길 권고 드립니다.
- 곱셈을 먼저, 나눗셈을 나중에 수행하는 것을 표준 코딩 규칙으로 삼아 정수의 곱셈을 먼저 이끈 후 나눗셈을 유도합니다.
- 중간 결과에 명시적으로
ROUND/TRUNC을 적용하여 자릿수를 엄격히 통제합니다. 소수점을 최대한 살려서 반올림 후 원하는 반올림을 유도합니다.
SQL> select round(round(8003/60*30,20), 0) from dual ; ROUND(ROUND(8003/60*30,20),0) ----------------------------- 4002 SQL> select round(8003*30/60,0) from dual ; ROUND(8003*30/60,0) ------------------- 4002