2011-07-08 48 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上有更詳細的描述。