sql操作顺序对于简单的数学计算没有意义

qjp7pelc  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(334)

我在一个存储过程中有一个简单的计算。根据我放置变量的顺序,我得到不同的结果
如果将其复制/传递到sql query analyzer中,就可以很容易地重现问题,从而得到不同的结果。我想要的结果是第二次计算(57364.32)

DECLARE @mnyDocTotal MONEY;
DECLARE @mnyUSDTotal MONEY
DECLARE @mnyDetailLine MONEY

SET @mnyDocTotal = 78000
SET @mnyUSDTotal = 86046.48
SET @mnyDetailLine = 52000

PRINT 'Result: ' + CAST(ROUND(@mnyDetailLine / @mnyDocTotal * @mnyUSDTotal,2) as char(20))
PRINT 'Result: ' + CAST(ROUND(@mnyDetailLine * @mnyUSDTotal / @mnyDocTotal,2) as char(20))

--Result:             57358.58
--Result:             57364.32

我相信/和*在同一水平面上,在这种情况下从左到右操作。
如果你用计算器计算这些数字,你总能得到57364.32。
这让我花了大约2个小时的时间来解决这个问题。我这么多年都没遇到过这种事。为什么结果不同?

ss2ws0br

ss2ws0br1#

本文很好地解释了为什么不应该使用 money .
它们不是数值。它们存储为整数。而且他们有舍入问题。所以:

(a * b) / c

由于四舍五入,可能产生不同的结果:

(a / c) * b

通常情况下,整数也是如此,这个简单的例子说明了这一点:

select (2 * 4 / 3), (2 / 3 * 4)

如果你用数字,你就不会有问题。这是一把小提琴。

相关问题