T-SQL十进制乘法

Ily*_*lya 9 t-sql

MSDN说明十进制乘法结果的精度和规模:

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

所以当我们执行这个时:

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

set @a = 1.123456789
set @b = 1

SELECT @a * @b
Run Code Online (Sandbox Code Playgroud)

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

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

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

31,32和38之间的结果相同.怎么解释这个?

小智 4

小数和数字运算结果的最小小数位数为 6 - 这是在 msdn 文档的表中指定的除法,但相同的行为也适用于乘法,以及在您的示例中小数位数截断的情况。

sqlprogrammability 博客上更详细地描述了此行为。