9
MSDN说,大约精度和scale of decimal multiplicatuion result:当一个结果精度大于38时,相应的比例被降低到T-SQL十进制乘法
- 结果精度和标有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结果相同。这怎么解释?
我刚想出一个猜测:也许这是为了防止用户在使用sum()函数时完全丢失小数(逗号后的数字)。它总是返回十进制(38,s),并且在将任意十进制数与相同的非零s(或者当s> = 2时甚至是s - 1)重合后,不会给出任何足够的结果(意思是获得非整数值) )。但是,对于这种情况,“保留”6位数字仍然看起来相当令人惊讶。也许关于这个主题的一些文档? – Ilya