2013-08-28 36 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)