我在一个存储过程中有一个简单的计算。根据我放置变量的顺序,我得到不同的结果
如果将其复制/传递到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个小时的时间来解决这个问题。我这么多年都没遇到过这种事。为什么结果不同?
1条答案
按热度按时间ss2ws0br1#
本文很好地解释了为什么不应该使用
money
.它们不是数值。它们存储为整数。而且他们有舍入问题。所以:
由于四舍五入,可能产生不同的结果:
通常情况下,整数也是如此,这个简单的例子说明了这一点:
如果你用数字,你就不会有问题。这是一把小提琴。