2011-07-08 62 views
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结果相同。这怎么解释?

+0

我刚想出一个猜测:也许这是为了防止用户在使用sum()函数时完全丢失小数(逗号后的数字)。它总是返回十进制(38,s),并且在将任意十进制数与相同的非零s(或者当s> = 2时甚至是s - 1)重合后,不会给出任何足够的结果(意思是获得非整数值) )。但是,对于这种情况,“保留”6位数字仍然看起来相当令人惊讶。也许关于这个主题的一些文档? – Ilya

回答

4

decimal和numeric经营成果有6最低规模 - 这是在MSDN文档划分表中指定,但相同的行为在规模上截断的情况下适用于乘法,以及在你的榜样。

此行为在sqlprogrammability blog上有更详细的描述。