2013-08-28 67 views
4

這兩個查詢的結果應該是相同的。相同的數據。相同的公式。相同的演員。一個結果是在查詢中針對一個表變量計算的,而另一個結果是針對變量計算的。我用臨時表和永久表替換了表變量,並得到了相同的結果。SQL公式返回不一致精度

爲什麼我的結果不同?

DECLARE 
    @comm DECIMAL(20 , 6) 
    , @quantity INT 
    , @multiplier INT 
    , @price DECIMAL(38 , 10) 

SET @comm = 210519.749988; 
SET @quantity = 360000; 
SET @multiplier = 1; 
SET @price = 167.0791666666; 

DECLARE @t AS TABLE 
    (
     [comm] [decimal](38 , 6) 
    , [multiplier] [int] 
    , [Quantity] [int] 
    , [Price] [decimal](38 , 10) 
    ) 

INSERT INTO @t 
    VALUES 
     (@comm , @quantity , @multiplier , @price) 

SELECT 
     @comm = comm 
     , @quantity = quantity 
     , @multiplier = multiplier 
     , @price = price 
    FROM 
     @t 

SELECT 
     CAST(comm/quantity/multiplier/price AS DECIMAL(32 , 10)) 
    FROM 
     @t 
UNION ALL 
SELECT 
     CAST(@comm/@quantity/@multiplier/@price AS DECIMAL(32 , 10)); 

結果

1. 0.0034990000 
2. 0.0035000000 

同樣的結果對不同的服務器。 SQL Server 2008 R2 Web Edition,Standard和Express以及SQL Server 2012 Standard。

+2

您的輸出類型,他們並不都完全相等。我看到'@comm DECIMAL(20,6)''但[COMM] [十進制](38,6)' –

回答

4

的差異是由於你的兩個DECIMAL場的精度差異:

更改@comm到(38,6)

DECLARE 
    @comm DECIMAL(38 , 6) 
    , @quantity INT 
    , @multiplier INT 
    , @price DECIMAL(38 , 10) 

我得到:

--------------------------------------- 
0.0034990000 
0.0034990000 

在同樣改變comm@t[comm] [decimal](20 , 6)讓我知道:

--------------------------------------- 
0.0035000000 
0.0035000000 

如果這些字段是一致的,結果將是一致的。

4

@comm被定義爲十進制(20,6),而comm列是十進制(38,6)。您還可以將一個帶有7個小數點的值分配給@comm,它只接受最多6位小數

根據docs,精度在20-28之間的小數點需要13個字節,而較大的小數點需要17個字節。當你SELECT存儲在comm回小@comm變量一些四捨五入就必然會發生的較大值。

0

聽起來好像有一個在您的數據類型的隱式轉換到選擇使用領域和使用選擇的內存變量之間的輸出數據類型的差異。

在對不同數據類型的變量/字段執行數學運算時,建議將它們先輸出(或相同的中間值)數據類型爲CAST

在這種情況下,您的問題可能是因爲DECLARE @comm DECIMAL(20 , 6),具有不同精度的DECIMAL(32, 10)