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个结果相同。怎么能解释这个?
答案 0 :(得分:4)
十进制和数字运算结果的最小比例为6 - 这在msdn文档的表格中指定了除法,但同样的行为也适用于乘法以及缩放截断的情况,如示例所示。
sqlprogrammability blog上详细介绍了此行为。