這聽起來像一個愚蠢的問題,但我注意到,在電子商務相關項目的很多表設計中,我幾乎總是會看到十進制(19,4)用於貨幣。十進制(19,4)或十進制(19.2) - 我應該使用哪一個?
爲什麼4的規模?爲什麼不是2?
也許我錯過了潛在的計算問題?
這聽起來像一個愚蠢的問題,但我注意到,在電子商務相關項目的很多表設計中,我幾乎總是會看到十進制(19,4)用於貨幣。十進制(19,4)或十進制(19.2) - 我應該使用哪一個?
爲什麼4的規模?爲什麼不是2?
也許我錯過了潛在的計算問題?
首先 - 您從其他答案收到一些不正確的建議。 Obseve以下(在64位架構的64位操作系統):
declare @op1 decimal(18,2) = 0.01
,@op2 decimal(18,2) = 0.01;
select result = @op1 * @op2;
result
---------.---------.---------.---------
0.0001
(1 row(s) affected)
注意標題下方下劃線的數 - 39在所有。 (我每十分鐘就更換一次以輔助計數。)這對於38位數字(64位CPU上的最大允許值和默認值)以及一個小數點顯示就足夠了。儘管兩個操作數都被聲明爲十進制(18,2),但計算已執行並報告爲十進制(38,4)數據類型。 (我在64位機器上運行SQL 2012 - 一些細節可能會因機器體系結構和操作系統而異)。
因此,顯然沒有丟失精度。相反,只會發生溢出,而不是精確損失。這是所有計算十進制操作數時作爲整數算術運算的直接後果。當十進制類型的中間字段的類型被報告爲int時,您將偶爾看到這種智能意義的僞影。
考慮上面的例子。兩個操作數都是十進制(18,2)類型,並且存儲爲值爲1的整數,比例爲2.當乘以乘積仍然爲1時,但通過將比例添加到比例來評估比例創建整數值1和標尺4,其是0.0001和類型十進制(18,4),存儲爲整數值爲1和標尺4
的再次閱讀最後一段的值的結果。
沖洗並重復一次。
實際上,在一個64位的機器和操作系統中,這實際上是作爲*十進制(38,4)類型存儲和轉發的,因爲計算是在一個額外位可用的CPU上完成的。
要回到你的問題 - 世界上所有主要貨幣(我知道)只需要2位小數,但有一小部分需要4位數,並且有諸如貨幣交易和債券等金融交易法律規定小數點後4位的銷售。在設計款項時數據類型Microsoft似乎選擇了可能需要的最大比例,而不是所需的正常比例。鑑於幾乎沒有交易和公司實際需要超過19位數的精度,這似乎非常合理。
如果您有:
那麼你會使用安全型小數與規模2(如十進制(19,2 )或十進制(18,2)或十進制(38,2))而不是金錢。這將減輕您的部分轉換次數,並且根據上述假設,不會有任何費用。這些假設爲 met的典型情況是在GL或Subledger會計系統中將交易記錄到該便士。但是,股票或債券交易系統不符合這些假設,因爲在這種情況下,規模的4位數是法律規定的。
來區分這兩種情況的一種方式是是否交易均以美分或百分比,只需要2位的規模,或在基點需要4位數字刻度的報道。
如果您不確定哪種情況適用於您的編程環境,請諮詢您的財務總監或財務總監,以瞭解您的應用程序的法律和GAAP要求。 (S)他將能夠給你明確的建議。
令人難以置信的細節和深思熟慮。謝謝彼得。 – user1447679 2014-12-06 22:44:58
在SQL中,19是整數量,4是小數點量。
如果您只有2位小數,並且您可能存儲了一些計算結果(導致超過2位小數),則「無法」存儲這些附加小數。
一些貨幣的操作超過2位小數。
使用數據類型小數,而不是金錢。
是不是整數的19?而這4個號碼被拿出來,用於該號碼的右側。 ? – user1447679 2014-12-05 22:29:42
是的,19是整數的數量(包括小數)。所以十進制(10,3)最大可以有9999999.999的數字[1234567.123] – 2014-12-05 22:35:22
你能想到一個需要使用4而不是2的例子嗎?讓我們說一個存儲每月訂閱價格的表格。尋找一個示例場景,可能的計算方法,或者某種程度上的原因,在規模上會有所幫助。 – user1447679 2014-12-05 22:42:52
當使用小數時,您要如何根據您的業務需求來使用它。
但是,當您在默認情況下使用Money數據類型時,它將存儲4位小數。
像天然氣價格這樣的事情會使用額外的「規模」職位。你已經看到每加侖1.959美元的天然氣了,對吧?
當你有一個ms-sql數據庫時,你可以使用數據類型money。 – 2014-12-05 22:23:55
@JoachimSauer - 十進制比金錢更準確,因爲我在許多電子商務類型的例子中看到十進制。 – user1447679 2014-12-05 22:27:03
更高的精度有助於減少舍入誤差 - 只是一個猜測 – Dinesh 2014-12-05 22:27:31