2010-01-10 60 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

+1,因爲我學到了一些東西......得看你的精度乘法時數字。 – JoshBerke 2010-01-10 17:30:07

回答

2

這是由於精度表示和舍入誤差。

的問題是由於

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

[請搜索SO多個實例]

相關:Sql Server Decimal(30,10) losing last 2 decimals

+0

即使他使用的是存儲確切數字的小數?基於交際屬性,產品應始終保持一致。除非可能他們將中間計算的結果存儲在一個十進制類型中,而我們在進行最後的乘法運算時會忽略精度。 – JoshBerke 2010-01-10 16:34:32

+0

我越想它,它確實看起來很奇怪。您總是嘗試重新表達以將較大的值乘以較小的值,並且由於精度損失而添加/減去類似大小的值。 – 2010-01-10 16:50:09

+0

@Josh,你是指交換財產?該屬性僅在無限精度情況下有效。米奇是正確的 - 當你乘以18位小數的兩個數字,你會得到一個36位小數的產品。十進制(38,20)不足以支持這一點。 – Aaronaught 2010-01-10 16:53:09