请查看下面的代码并向我解释为什么最终结果会出现偏差。请注意,区别在于第二次计算中引入了括号。谢谢!
代码:
DECLARE @A decimal(38,19) = 7958011.98
DECLARE @B decimal(38,19) = 10409029441
DECLARE @C decimal(38,19) = 10000000000
DECLARE @Z1 decimal(38,19)
DECLARE @Z2 decimal(38,19)
SET @Z1 = @A * @B / @C
SET @Z2 = @A * (@B / @C)
SELECT @Z1 AS [Correct],
@Z2 AS [Wrong]
结果:
Correct = 8283518.0991650000000000000
Wrong = 8283510.5860060000000000000
答案 0 :(得分:1)
即,首先评估(@B / @C)
,遵循this之类的规则。然后,中间数据类型会影响@A
你可以在这里看到中间类型和最终类型(在分配给小数(38,19)类型之前
SELECT
@A * @B, -- decimal (x, 6)
@A * @B / @C, -- decimal (x, 6)
(@B / @C), -- decimal (x, 6)
@A * (@B / @C) -- decimal (x, 6)
所以,而不是 1.0409029441 ,你的第二次数学得到 1.040902
注意,你的第一个也是错的。它实际上是 8283518.099165070318