插入时的T-SQL乘法小数精度损失(重新访问)

时间:2014-07-14 12:46:27

标签: sql-server-2012

请考虑以下T-SQL代码:

USE [Some.Database]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[davetest](
    [factor1] [decimal](20, 8) NULL,
    [factor2] [decimal](20, 8) NULL,
    [factor3] [decimal](20, 8) NULL,
    [answer] [decimal](20, 8) NULL
) ON [PRIMARY]

GO

现在,请考虑一下:

SELECT CAST( 0.11970939 * 0.07237864 *  0.0873142 AS decimal(20,8)) -- returns 0.00075653

最后,使用相同的值检查这两个更新命令:

  UPDATE davetest
  SET factor1 = 0.11970939,
  factor2 = 0.07237864,
  factor3 = 0.0873142

  UPDATE davetest
  SET answer = CAST( factor1 * factor2 * factor3 AS decimal(20,8))  -- answer is now 0.00075700

所以......问题是......不必要的舍入,小数点后6位,当我想得到8位小数时。当我真的想要0.00075653时,我得到了0.00075700。

我看过类似的帖子听起来相当明确,尤其是:

Sql Server Decimal(30,10) losing last 2 decimals

但这对我没有帮助。我尝试扩大精度,铸造各种各样的东西,我尝试在进行乘法之前输入输入值等;这些都没有真正给我理想的答案。

显然,将UPDATE执行到具有相同精度的十进制列的行为给出了一个简单的SELECT语句的不同答案;从其他帖子和类似帖子中,我已经了解了它为什么会发生;问题是,当我进行更新时,如何在SELECT中获得相同的答案?

任何帮助表示赞赏。非常感谢。 戴夫

0 个答案:

没有答案