SQL公式返回不一致的精度

SQL公式返回不一致的精度,sql,sql-server,tsql,Sql,Sql Server,Tsql,两个查询的结果应该相同。同样的数据。同样的公式。同样的演员阵容。一个结果是在查询中针对表变量计算的,而第二个结果是针对变量计算的。我用temp table和permanent table替换了table变量,结果相同 为什么我的结果不同 DECLARE @comm DECIMAL(20 , 6) , @quantity INT , @multiplier INT , @price DECIMAL(38 , 10) SET @comm = 210519.749988; SET

两个查询的结果应该相同。同样的数据。同样的公式。同样的演员阵容。一个结果是在查询中针对表变量计算的,而第二个结果是针对变量计算的。我用temp table和permanent table替换了table变量,结果相同

为什么我的结果不同

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 and Express和SQL Server 2012 Standard。

差异是由于您的两个
十进制
字段的精度不同造成的:

将@comm更改为
(38,6)

我得到:

---------------------------------------
0.0034990000
0.0034990000
同样地,将
@t
中的
comm
更改为
[comm][decimal](20,6)
会让我:

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

如果字段一致,则结果将一致。

@comm
定义为十进制(20,6),而
comm
列定义为十进制(38,6)。您还可以为@comm指定一个带有7个小数点的值,该值最多只能接受6位小数


根据统计,精度在20-28之间的小数需要13个字节,而较大的小数需要17个字节。当
选择
存储在
comm
中的较大值返回到较小的
@comm
变量中时,必然会发生一些舍入。

听起来,在使用SELECT字段和使用SELECT内存变量之间,数据类型对输出数据类型的隐式转换似乎有所不同

在对不同数据类型的变量/字段执行数学运算时,建议先将它们转换为输出(或相同的中间)数据类型


在这种情况下,您的问题可能是因为
DECLARE@comm DECIMAL(20,6)
,它与您的输出类型
DECIMAL(32,10)

的精度不同,它们并不完全相同。我看到
@comm-DECIMAL(20,6)
但是
[comm][DECIMAL](38,6)
---------------------------------------
0.0035000000
0.0035000000