SQL公式返回不一致的精度
两个查询的结果应该相同。同样的数据。同样的公式。同样的演员阵容。一个结果是在查询中针对表变量计算的,而第二个结果是针对变量计算的。我用temp table和permanent table替换了table变量,结果相同 为什么我的结果不同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
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