T-SQL十进制乘法

时间:2011-07-08 12:39:02

标签: tsql

MSDN说明了精度和scale of decimal multiplicatuion result

  
      
  • 结果精度和标度的绝对最大值为38.当结果精度大于38时,相应的标度会减小,以防止结果的整数部分被截断。
  •   

所以当我们执行这个时:

DECLARE @a DECIMAL(18,9)
DECLARE @b DECIMAL(19,9)

set @a = 1.123456789
set @b = 1

SELECT @a * @b

结果是1.12345689000000000(9个零),我们看到它没有被截断,因为18 + 19 + 1 = 38(上限)。

当我们将@a的精度提高到27时,我们会丢失所有零,结果只有1.123456789。更进一步,我们继续截断并将结果舍入。例如,将@a的精度提高到28会产生1.12345679(8位数)。

有趣的是,在某些时候,精度等于30,我们有1.123457,这个结果不会再改变(它会停止被截断)。

31,32和最多38个结果相同。怎么能解释这个?

1 个答案:

答案 0 :(得分:4)

十进制和数字运算结果的最小比例为6 - 这在msdn文档的表格中指定了除法,但同样的行为也适用于乘法以及缩放截断的情况,如示例所示。

sqlprogrammability blog上详细介绍了此行为。