请考虑以下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中获得相同的答案?
任何帮助表示赞赏。非常感谢。 戴夫