Sql-Server
小數相乘時如何計算精度和比例?
小數除法時,結果值的精度和小數位數根據以下公式計算:
最大精度 = (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.