Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL乘法差异_Tsql - Fatal编程技术网

Tsql SQL乘法差异

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

在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 @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因为我学到了一些东西……在相乘数字时要注意精度。