0

请查看下面的代码并向我解释为什么最终结果会出现偏差。请注意,不同之处在于第二次计算中引入了括号。谢谢!

代码:

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
4

1 回答 1

1

由于这篇MSDN 文章,中间数据类型不同

也就是说,(@B / @C)首先评估,遵循这样规则。然后中间数据类型会影响乘法@A

您可以在此处查看中间类型和最终类型(在分配给 decimal(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.040902而不是1.0409029441

请注意,您的第一个也是错误的。实际上是8283518.099165070318

于 2013-01-07T13:30:45.073 回答