翻譯|使用教程|編輯:楊鵬連|2020-12-16 11:49:06.740|閱讀 447 次
概述:在計算過程中,由于舍入誤差,使用MONEY和SMALLMONEY數據類型可能會導致意外的精度損失。通常最好使用DECIMAL(又名NUMERIC)類型。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
SQL Prompt是一款實用的SQL語法提示工具。SQL Prompt根據數據庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據需要進行自定義,使之以預想的方式工作。
該MONEY數據類型混淆了它們的顯示數據值的存儲,但它的名字明確提示了排序它擁有的數據。它是SQL Server專有的,允許您指定貨幣值后加貨幣符號,但是SQL Server根本不存儲任何帶有實際數值的貨幣信息,因此其目的尚不清楚。
精度有限;基礎類型是aBIGINT或(如果是SMALLMONEY,則是an)INT,因此由于舍入錯誤,您可能會無意間失去精度。盡管簡單的加法或減法很好,但是可以對財務報告進行的更復雜的計算可能會顯示錯誤。盡管MONEY數據類型通常占用較少的存儲空間,并且在通過TDS通過網絡發送時占用的帶寬也較小,但是通常最好使用諸如theDECIMAL或NUMERICtype這樣的數據類型,這種數據類型不太可能出現舍入錯誤或小數位溢出。
SQL Prompt(BP022)中的“最佳實踐”代碼分析規則中包含避免使用MONEY或SMALLMONEY數據類型的建議。
使用MONEY數據類型時的舍入錯誤
該MONEY和SMALLMONEY數據類型是精確到大約萬分之一貨幣單位的,他們代表。SMALLMONEY在– 214,748.3648和214,748.3647MONEY之間準確,而在-922,337,203,685,477.5808(-922,337萬億)和922,337,203,685,477.5807(922,337萬億)之間準確。
盡管MONEY可以用貨幣符號表示,但不會存儲此信息。在幕后,MONEY存儲為整數數據類型。十進制數字(用于存儲貨幣值的更常用的選擇)的準確范圍在-10 ^ 38 +1到10 ^ 38 – 1之間。
科學界可以容忍微小的舍入誤差和誤差幅度,但在金融領域,貨幣計算是對還是錯。認為奇數美分或便士不值得擔心是徒勞的。當我是一個錯誤的答案時,我一直被自己嘲笑。
以清單1中的計算為例,這是我能想到的最簡單的計算方法。
DECLARE @MoneyTable TABLE (Total MONEY, Portion MONEY); INSERT INTO @MoneyTable (Total, Portion) VALUES ($271.00, $199.50), ($4639.00, $4316.00), ($8031.00, $7862.00), ($7558.00, $7081.00), ($9912.00, $9547.00), ($389.00, $179.00), ($4495.00, $4214.00), ($2844.00, $2398.00), ($265.67, $124.33), ($4936.56, $967.54); SELECT Portion, Total, (Portion / total)*100 AS Percentage FROM @MoneyTable清單1
結果如下:
DECLARE @MoneyTable TABLE (Total DECIMAL(19, 4), Portion DECIMAL(19, 4)); INSERT INTO @MoneyTable (Total, Portion) VALUES (271.00, 199.50), (4639.00, 4316.00), (8031.00, 7862.00), (7558.00, 7081.00), (9912.00, 9547.00), (389.00, 179.00), (4495.00, 4214.00), (2844.00, 2398.00), (265.67, 124.33), (4936.56, 967.54); SELECT Portion,Total, cast((Portion / Total) * 100 as numeric(19,2)) AS percentage FROM @MoneyTable清單2
這次,答案與我們在Excel中看到的答案相同:
下圖顯示了在做反向計算的結果,即在計算portion值,從total和percentage。我們無法根據使用數據類型(清單1)產生的值精確地計算出portion(或total),這一事實證實了這些百分比值中存在舍入誤差。percentageMONEY
如果在使用值時嘗試以經典方式計算相關性,則還會出現刻度溢出錯誤MONEY。如果您試圖在許多行中找到貨幣價值與其他變量之間的關系,則存儲在平方計算的中間和中的值會變得非常大。這將導致相關值錯誤。如果無法避免MONEY數據類型,那么最好使用內置的StDevP()聚合函數來獲取相關性。
概要
基本上,在DECIMAL(aka NUMERIC)中使用小數點右邊的位數盡可能多地進行計算是值得的,并且僅使用兩個或三個小數位來顯示結果。對于除加法或減法之外的所有運算所涉及的數據類型,小數點右邊的四位數刻度并不總是足夠的。在計算中也要注意“四舍五入”。
MONEY如果您知道所有約束和變通辦法,例如可以NUMERIC在使用除法或乘法運算的計算中使用數據類型,或使用內置的聚合函數,則可以使其性能良好且準確。MONEY在內部使用整數,因此速度很快,并且通常使用較少的存儲空間,特別適合作為TDS在網絡上傳輸。但是,僅適用于專家。
試用下載>>>本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: