MSSQL 2008/MSSQL SQL

소수점 자리 계산시 계산 오류가 발생하는 이유

본클라쓰 2013. 11. 12. 12:36

 

DECLARE @A FLOAT
DECLARE @B FLOAT

SET @A = 10
SET @B = 10 - 0.01

SELECT @A - @B

 

위 쿼리문을 수행하면 다음과 같은 결과를 얻을 수 있다.

 

0.00999999999999979

 

원래 얻고자 하는 결과는 10 - (10 - 0.01)) = 0.01 이지만 소수점 자리수가 17자리인 근사치 값이 출력되었다.

이러한 차이는 어디서 오는 것일까?

 

FLOAT 와 REAL 데이터형은 근사 데이터 형식이다. 근사 숫자 데이터 형식은 여러 숫자에 지정된 정확한 값을 저장하지 않고 가장 가까운 근사값을 저장한다. 대부분의 응용 프로그램에서 지정된 값과 저장된 근사값 간의 사소한 차이는 무시되지만 그렇지 않은 경우도 있다.

 

따라서 FLOAT 및 REAL 데이터 형식에는 근사 속성이 있으므로 금융 관련 응용 프로그램과 같이 반올림 또는 등가 확인 등이 이루어지는 작업에서 정확한 숫자가 필요한 경우에는 사용하지 마시오.

 

참고) MSDN SQL 서버 데이터 형식  http://msdn.microsoft.com/ko-kr/library/ms187752.aspx

 

따라서 원하는 정확한 결과를 얻기 위해서는 자료형을 정확한 숫자형으로 변환해 처리해야 한다.

 

SELECT CAST(@A AS NUMERIC(10,3)) - CAST(@B AS NUMERIC(10,3))

 

위 쿼리문을 수행하면 정확한 결과값인 0.01을 얻을 수 있다.

 

DECIMAL 이나 NUMERIC 데이터 형식은 정확한 숫자를 저장한다. 저장된 값의 근사값은 없다. DECIMAL 이나 NUMERIC 데이터 형식의 기본 전체 자릿수는 최대값이 38이다.

 

 

 

 

'MSSQL 2008 > MSSQL SQL' 카테고리의 다른 글

DELETE 명령어에 조인을 사용하여 처리하기  (0) 2013.08.30
UPDATE 쿼리문  (0) 2013.01.11
조인  (0) 2012.09.25
VIEW 생성   (0) 2012.09.20
문자열 처리 함수  (0) 2012.08.08