SQL Server和Excel中的不同计算

这是我的公式。 我把它放在一个SQL Server存储过程中:

DECLARE @Var01 float SET @Var01 = 1164.83 * (1 - 3.3387306 * LOG(0.00459418151829729) + 1.426559 * POWER(LOG(0.00459418151829729),2)) / (1 - 3.4680733 * LOG(0.00459418151829729) + 1.8779192 * POWER(LOG(0.00459418151829729), 2) - 0.21223784 * POWER(LOG(0.00459418151829729), 3) - 0.0035814371 * POWER(LOG(0.00459418151829729), 4) - 0.90903163 * POWER(10, -4) * POWER(LOG(0.00459418151829729), 5)) - 459.67 

其结果是: 214.630185149416

然后我试图比较excel,公式如下:

 =1164.83 * (1 - 3.3387306 * LN(0.00459418151829729) + 1.426559 * (LN(0.00459418151829729)) ^ 2) / (1 - 3.4680733 * LN(0.00459418151829729) + 1.8779192 * (LN(0.00459418151829729)) ^ 2 - 0.21223784 * (LN(0.00459418151829729)) ^ 3 - 0.0035814371 * (LN(0.00459418151829729)) ^ 4 - 0.90903163 * 10 ^ -4 * (LN(0.00459418151829729)) ^ 5) - 459.67 

其结果是: 211.981432072480

问题是,哪一个是正确的? 任何想法? 什么计算是不同的?

评论推测这是舍入错误,并且SQL Server更可靠,因为它使用比Excel更精确的浮点数。 这是错误的。 相对误差约为1%。 如果执行一个简短的计算,而不是10% -13 %的舍入误差,则不会得到1%的相对误差,除非您正在减去几乎相等的大数。

我build议打破计算,看看SQL Server和Excel是否同意,看看他们在哪里分歧。 这将工作。 这就像是通过一个程序,而不是只是说最终的结果是不是所期望的。 您可以执行二进制search以快速find问题,但OP没有提供任何其他信息。

正在执行的计算是

frac {1 + 17.9723 + 41.3364} {1 + 18.6685 + 54.4152 + 33.1045-3.00707 + 0.410853}  -  459.67

= 1164.83 \ frac {60.3087} {104.592} -459.67

= 211.981

没有任何可能导致较大相对误差的大数字取消。 所以,我试图解决

1164.83 \ frac {60.3087} {104.592 + x} -459.67 = 214.630185149416

看看分母中有什么错误会导致错误的计算。 用微积分,我可以检查常量中的拼写错误。 解决scheme是x = -0.410829。 这几乎就是分母的最后一个术语。 所以,答案并不是这些环境之一在简单的浮点计算中产生1%的相对误差,而是分母中的一个项被删除了。 把这个计算分解成几个部分,这是显而易见的。

最后一个词是唯一一个像POWER(10,-4)的东西。 难道这是使用整数算术而不是浮点数进行的,所以它的计算结果是0而不是0.0001? 是的, 显然这就是SQL Server所做的 。 这就像整数运算中的1/2 = 0。 如果你想要一个十进制输出,你必须给它一个十进制input。 将10转换为十进制,将其更改为POWER(10.0,-4),使用0.0001,或对整个系数使用适当的科学记数法。