Sql-Server

小數相乘時如何計算精度和比例?

  • November 2, 2015

小數除法時,結果值的精度和小數位數根據以下公式計算:

最大精度 = (p1 - s1 + s2) + MAX(6, s1 + p2 + 1) – 最多 38

最大比例 = MAX(6, s1 + p2 + 1)

小數相乘時的公式是什麼?

例如:

IF OBJECT_ID('tempdb..#DataSource') IS NOT NULL
BEGIN
   DROP TABLE #DataSource;
END;

SELECT CAST(1 AS DECIMAL(9,0)) / CAST(2 AS DECIMAL(9,0)) AS C1 
     ,CAST(1 AS DECIMAL(9,0)) / CAST(2 AS DECIMAL(9,0)) * 100 AS C2
     ,CAST(1 AS DECIMAL(9,0)) / CAST(2 AS DECIMAL(9,0)) * CAST(100  AS DECIMAL (3, 0)) AS C3
INTO #DataSource;

EXEC tempdb.dbo.sp_help '#DataSource';

在此處輸入圖像描述

C1根據指定的公式計算列的精度和小數位數:

p1 = 9
p2 = 9
s1 = 0
s2 = 0

max precision = (9 - 0 + 0) + MAX(6, 0 + 9 + 1) --> 19
max scale = MAX(6, 0 + 9 + 1) --> 10

當此結果乘以100(值100轉換為DECIMAL(3,0))時,結果具有精度為23和標度10

如果應用相同的公式,則值如下:

p1 = 19
p2 = 3
s1 = 10
s2 = 0

max precision = (19 - 10 + 0) + MAX(6, 10 + 3 + 1) --> 9 + 14 = 23
max scale = MAX(6, 10 + 3 + 1) --> 14

所以,精度是正確的,但規模更大 -14相反10

誰能告訴小數相乘時計算精度和比例的公式是什麼?

我對 StackOverflow 上的一個非常相似的問題有一個答案:

如何控制計算列的數據類型?

但是,在這裡更完整地說明它:


我建議查看問題中發布的連結中使用的源文件,因為它描述了用於涉及小數的 6 種不同運算的公式:精度、比例和長度。該圖表顯示:

操作: e1 * e2

結果精度: p1 + p2 + 1

結果規模: s1 + s2

在有 a 的情況下DECIMAL(19, 10) * DECIMAL(3, 0),我們從以下值開始:

p1 = 19
p2 =  3

s1 = 10
s2 =  0

這給了我們:

Precision = (19 + 3 + 1) = 23
Scale     = (10 + 0) = 10

DECIMAL(23, 10)這與SQL Server 報告的相匹配。

為了更清楚,我在測試查詢中添加了第 4 列,以減少對結果的初始除法計算,DECIMAL(19, 10)因此不存在 3 個數學運算在C2和中發生的順序問題C3。我也在使用sys.dm_exec_describe_first_result_set DMV,因此無需創建臨時表 :-)

SELECT rs.column_ordinal, rs.name, rs.system_type_name, rs.max_length,
      rs.[precision], rs.[scale]
FROM   sys.dm_exec_describe_first_result_set(N'
SELECT CAST(1 AS DECIMAL(9,0)) / CAST(2 AS DECIMAL(9,0)) AS C1
     ,CAST(1 AS DECIMAL(9,0)) / CAST(2 AS DECIMAL(9,0)) * 100 AS C2
    ,CAST(1 AS DECIMAL(9,0)) / CAST(2 AS DECIMAL(9,0)) * CAST(100 AS DECIMAL (3, 0)) AS C3
     ,CAST(0.5 AS DECIMAL(19,10)) * CAST(100 AS DECIMAL(3,0)) AS C4
', '', 0) rs

回報:

column_ordinal    name    system_type_name    max_length    precision    scale
--------------    ----    ----------------    ----------    ---------    -----
1                 C1      decimal(19,10)       9            19           10
2                 C2      decimal(23,10)      13            23           10
3                 C3      decimal(23,10)      13            23           10
4                 C4      decimal(23,10)      13            23           10

為方便起見,上面連結的 MSDN 頁面中的精度和比例計算的完整圖表複製如下:

Operation           Result precision                          Result scale *
---------           -----------------------------------       ------------
e1 + e2             max(s1, s2) + max(p1-s1, p2-s2) + 1       max(s1, s2)

e1 - e2             max(s1, s2) + max(p1-s1, p2-s2) + 1       max(s1, s2)

e1 * e2             p1 + p2 + 1                               s1 + s2

e1 / e2             p1 - s1 + s2 + max(6, s1 + p2 + 1)        max(6, s1 + p2 + 1)

e1 UNION |          max(s1, s2) + max(p1-s1, p2-s2)           max(s1, s2)
 EXCEPT |
INTERSECT e2 

e1 % e2             min(p1-s1, p2 -s2) + max( s1,s2 )         max(s1, s2)

* The result precision and scale have an absolute maximum of 38.
 When a result precision is greater than 38, the corresponding scale
 is reduced to prevent the integral part of a result from being truncated.

引用自:https://dba.stackexchange.com/questions/119811