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