Tsql SQL乘法差异
在SQLServer2005/2008上,当我将Tsql SQL乘法差异,tsql,Tsql,在SQLServer2005/2008上,当我将十进制数相乘时,我偶然发现了这种奇怪现象。有人能解释一下效果吗 DECLARE @a DECIMAL(38,20) DECLARE @b DECIMAL(38,20) DECLARE @c DECIMAL(38,20) SELECT @a=1.0, @b=2345.123456789012345678, @c=23456789012345.999999999999999999 SELECT CASE WHEN
十进制数
相乘时,我偶然发现了这种奇怪现象。有人能解释一下效果吗
DECLARE @a DECIMAL(38,20)
DECLARE @b DECIMAL(38,20)
DECLARE @c DECIMAL(38,20)
SELECT @a=1.0,
@b=2345.123456789012345678,
@c=23456789012345.999999999999999999
SELECT CASE WHEN @a*@b*@c = @c*@b*@a
THEN 'Product is the same'
ELSE 'Product differs'
END
这是由于精确表示和舍入误差造成的 这个问题是由于
SELECT @a*@b --(=2345.123457)
[请搜索多个示例。]
相关:即使他使用的是一个存储精确数字的十进制数?基于交际属性,产品应该始终是相同的。除非他们可能把中间计算的结果存储在十进制类型中,我们在做最后的乘法运算时没有精确性。我越想越觉得奇怪。由于精度的损失,您总是试图重新调整表达式以将大值乘以小值,并对大小相同的值进行加减。@Josh,您是说交换属性吗?该属性仅在无限精度场景中有效。米奇是对的——当你把两个数字乘以18位小数时,你会得到一个36位小数的乘积。小数点(38,20)不足以容纳它。@Aaronaught:这就是我猜发生的事情,他们在根据变量在表达式中的位置进行乘法运算。当@a*@b相乘时,它们将结果存储在十进制中,然后再乘以@c,所以当你改变顺序时,精度会很重要。+1因为我学到了一些东西……在相乘数字时要注意精度。