首页 > 解决方案 > SQL 操作顺序对简单的数学计算没有意义

问题描述

我在存储过程中有一个简单的计算要做。根据我放置变量的顺序,我得到不同的结果

如果您将其复制/粘贴到 SQL 查询分析器中,您可以轻松地重现我得到不同结果的问题。我正在寻找的结果是第二次计算(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 个小时的时间来解决这个问题。在我所有的岁月里,我从来没有遇到过这个问题。为什么结果不一样?

标签: sql

解决方案


这篇文章很好地解释了为什么你不应该使用money.

它们不是数值。它们存储为整数。他们有四舍五入的问题。所以:

(a * b) / c

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

(a / c) * b

一般来说,这实际上适用于整数,正如这个简单的示例所示:

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

如果你使用数字,你不会有问题。 是一个 db<>fiddle。


推荐阅读