2013-02-25 2 views
0

SQL Server 2008 R2 및 SQL Server 2012를 사용하여 다음을 시도하고 있는데 두 경우 모두 동일한 결과가 나타납니다.SQL Server에서 숫자를 반올림하는 중 오류가 발생했습니다.

나는 다음과 같은 문 작성하는 경우 :

declare @result float 
select @result = 4.005 
select round(@result, 2) 

내가 예상치 못한 결과를 얻을 : 나는 다음 문을 작성하는 경우에는 4.01

: 내가 예상 결과를 얻을

select round(4.005, 2) 

를 : 4

그러나 내가 바꾸면 float 이전 문에서 실제 로 :

declare @result real 
select @result = 4.005 
select round(@result, 2) 

내가 예상 결과를 얻을.

아무도 왜이 일이 일어 났는지 말할 수 있습니까?

답변

0

이것은 float가 근사 데이터 유형 인 것과 관련이 있습니다.

볼 : http://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

플로트와 실제 데이터 유형은 대략 데이터 타입으로 공지되어있다. float 및 real의 동작은 근사 숫자 데이터 유형에 대한 IEEE 754 사양을 따릅니다. 근사 숫자 데이터 유형은 많은 숫자에 대해 지정된 정확한 값을 저장하지 않습니다. 그들은 값의 매우 근사치를 저장합니다. 많은 응용 프로그램에서 지정된 값과 저장된 근사값 사이의 작은 차이는 눈에 띄지 않습니다. 때때로, 그 차이가 눈에 띄게됩니다. float 및 실제 데이터 형식의 근사 특성 때문에 은 재무 응용 프로그램, 반올림 연산 또는 동등한 검사와 같이 정확한 숫자 동작이 필요할 때 이러한 데이터 형식을 사용하지 않습니다. 대신 integer, decimal, money 또는 smallmoney 데이터 형식을 사용하십시오. WHERE 절 검색 조건에서 float 또는 실제 열을 사용하지 마십시오. 특히 = 및 <> 연산자. 플로트 및 실수 열을> 또는 < 비교로 제한하는 것이 가장 좋습니다.

IEEE 754 사양은 4 개의 반올림 모드를 제공합니다. 가장 가까운 반올림, 반올림, 반올림 및 0으로 반올림입니다. Microsoft SQL Server는 라운드 업을 사용합니다. 모두 정밀도는 보장되지만 부동 소수점 값은 약간 다를 수 있습니다. 부동 소수점 숫자의 이진 표현은 많은 법적 반올림 스키마 중 하나를 사용할 수 있으므로 부동 소수점 값을 안정적으로 계량하는 것은 불가능합니다.

+0

귀하의 회신에 감사드립니다. – vcRobe

1

당신이 과학적 표기법의 부동 소수점 수의 가수를 저장하는 데 사용되는 비트 수를 지정하지 않았기 때문에, 이것을 시도,

declare @result float(5) 
select @result = 4.005 
select round(@result, 2) 
+0

float (5) = real (온라인 설명서의 내용) 때문에 값을 지정하지 않으면 53이 기본값으로 사용되므로 24보다 큰 값으로 시도하면 실패합니다 . 왜? – vcRobe

관련 문제