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