2010-01-10 6 views
4

SQL Server 2005/2008에 DECIMAL 숫자를 곱하면이 홀수가 나타납니다. 누구든지 효과를 설명 할 수 있습니까?SQL 곱하기 불일치

DECLARE @a DECIMAL(38,20) 
DECLARE @b DECIMAL(38,20) 
DECLARE @c DECIMAL(38,20) 

SELECT @a=1.0, 
     @b=2345.123456789, 
     @c=23456789.999999999999999999 

SELECT CASE WHEN @a*@b*@c = @c*@b*@a 
     THEN 'Product is the same' 
     ELSE 'Product differs' 
     END 
+0

일 ... 꼭 당신의 정밀도를 볼 곱하면 번호. – JoshBerke

답변

2

이는 정밀도 표현 및 반올림 오류 때문입니다.

문제는 [여러 예제 SO 검색하시기 바랍니다.]

SELECT @a*@b --(=2345.123457) 

때문이다

관련 : 뭔가를 배운 이후 Sql Server Decimal(30,10) losing last 2 decimals

+0

정확한 숫자를 저장하고있는 십진수를 사용하고 있습니까? 통신 속성에 따라 제품은 항상 동일해야합니다. 아마도 중간 계산의 결과를 십진 형식으로 저장하지 않는 한, 정밀도를 느슨하게 할 수 있습니다. 마지막 곱셈 연산을 수행 할 때입니다. – JoshBerke

+0

그것에 대해 더 생각하면 이상하게 보입니다. 당신은 항상 작은 값으로 큰 값을 곱하기 위해 표현을 다시 시도하고, 정밀도의 손실로 인해 같은 크기의 값을 더하거나 뺍니다. –

+0

@Josh, 교환 재산을 의미합니까? 이 속성은 무한 정밀도 시나리오에서만 유효합니다. 미치가 옳다 - 두 자리를 18 자리로 곱하면 소수 자리가 36 자리 인 제품을 얻을 수있다. 십진수 (38, 20)로는 충분하지 않습니다. – Aaronaught