[ACCESS] 엑세스의 Round 함수의 버그? 오작동 사례.
Access를 이용해 데이터 처리를 하던 도중 의도치 않는 결과가 나온다는 보고가 있어서 찾아보았다.
흔히 반올림 처리를 위해 사용하는 Round 함수가 특정 규칙을 가지고 오작동을 하고 있었다.
0.5 => 1
1.5 => 2
2.5 => 2
3.5 => 4
4.5 => 4
5.5 => 6
6.5 => 6
....
이렇게 격수로 하나씩 건너뛰면서 반올림, 내림, 반올림, 내림 처리를 하고 있는 것이었다.
증거자료..
아래와 같이 실수(Single)타입의 값1~값6 필드를 가진 테이블을 만들어서 값들을 채워넣고..
아래의 쿼리를 돌려서 나온 결과..
SELECT
SUM(값1) AS 원값
,SUM(값2) AS [원값빼기05]
,SUM(값3) AS [원값빼기1]
,SUM(값4) AS [원값빼기15]
,SUM(값5) AS [원값빼기25]
,SUM(값6) AS [원값빼기35]
FROM 테이블1
UNION ALL
SELECT
ROUND(SUM(값1),0)
,ROUND(SUM(값2),0)
,ROUND(SUM(값3),0)
,ROUND(SUM(값4),0)
,ROUND(SUM(값5),0)
,ROUND(SUM(값6),0)
FROM 테이블1;
결과를 보면 17.5는 정상적으로 18로 반올림 처리가 되었으나 12.5의 반올림은 13이 되지 않고 12가 되었다.
역시 7.5는 반올림되어 8이 되었으나 2.5는 내림이 되어 2가 되어버렸다.
추측하기에는 실수(Single)값의 부동소숫점 연산 처리때문에 그런게 아닐까 싶지만..
별생각없이 반올림 처리하려고 Round를 자주 쓰게 되는데 이러면 곤란하다..
특히 이건 SAT 채점의 Omit처리를 하다 발견된 건데,, 점수의 계산이 틀어지면 끝장이지 않은가.
해서 해결방안은. Round함수를 뜯어고칠수는 없으니,,
Round(SUM(값1)+0.1 , 0) 으로 일괄적으로 0.1을 더해주었다. 정수반올림을 하는데에는 0.1 더해주는거면 충분함..
'MS-SQL' 카테고리의 다른 글
[LocalDB] SQL2012 LocalDB의 Collation 문제 해결 (2) | 2013.09.11 |
---|---|
[ACCESS] Round 함수의 결과값 반환에 대한 이해. (0) | 2013.07.12 |
써보면 편리한 MSSQL Split 함수 세 개. (3) | 2012.12.29 |
MS-SQL Server 2012 – LocalDB를 사용해보자. (ADO Connection) (0) | 2012.11.03 |
오류 : 사용자 'sa'의 계정이 현재 잠겨 있으므로 로그인하지 못했습니다. 시스템 관리자가 잠금을 해제할 수 있습니다. (0) | 2011.12.29 |