2014-12-05 48 views
5

這聽起來像一個愚蠢的問題,但我注意到,在電子商務相關項目的很多表設計中,我幾乎總是會看到十進制(19,4)用於貨幣。十進制(19,4)或十進制(19.2) - 我應該使用哪一個?

爲什麼4的規模?爲什麼不是2?

也許我錯過了潛在的計算問題?

+0

當你有一個ms-sql數據庫時,你可以使用數據類型money。 – 2014-12-05 22:23:55

+0

@JoachimSauer - 十進制比金錢更準確,因爲我在許多電子商務類型的例子中看到十進制。 – user1447679 2014-12-05 22:27:03

+0

更高的精度有助於減少舍入誤差 - 只是一個猜測 – Dinesh 2014-12-05 22:27:31

回答

10

首先 - 您從其他答案收到一些不正確的建議。 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位數的精度,這似乎非常合理。

如果您有:

  1. 的只處理主要貨幣(這在目前的時間只需要2位的規模)的高期望值;和
  2. 處理交易的任何期望,由法律規定,要求4位數字的規模

那麼你會使用安全型小數與規模2(如十進制(19,2 )十進制(18,2)十進制(38,2))而不是金錢。這將減輕您的部分轉換次數,並且根據上述假設,不會有任何費用。這些假設 met的典型情況是在GL或Subledger會計系統中將交易記錄到該便士。但是,股票或債券交易系統不符合這些假設,因爲在這種情況下,規模的4位數是法律規定的。

來區分這兩種情況的一種方式是是否交易均以美分百分比,只需要2位的規模,或在基點需要4位數字刻度的報道。

如果您不確定哪種情況適用於您的編程環境,請諮詢您的財務總監或財務總監,以瞭解您的應用程序的法律和GAAP要求。 (S)他將能夠給你明確的建議。

+2

令人難以置信的細節和深思熟慮。謝謝彼得。 – user1447679 2014-12-06 22:44:58

0

在SQL中,19是整數量,4是小數點量。

如果您只有2位小數,並且您可能存儲了一些計算結果(導致超過2位小數),則「無法」存儲這些附加小數。

一些貨幣的操作超過2位小數。

使用數據類型小數,而不是金錢。

+1

是不是整數的19?而這4個號碼被拿出來,用於該號碼的右側。 ? – user1447679 2014-12-05 22:29:42

+1

是的,19是整數的數量(包括小數)。所以十進制(10,3)最大可以有9999999.999的數字[1234567.123] – 2014-12-05 22:35:22

+0

你能想到一個需要使用4而不是2的例子嗎?讓我們說一個存儲每月訂閱價格的表格。尋找一個示例場景,可能的計算方法,或者某種程度上的原因,在規模上會有所幫助。 – user1447679 2014-12-05 22:42:52

0

當使用小數時,您要如何根據您的業務需求來使用它。

但是,當您在默認情況下使用Money數據類型時,它將存儲4位小數。

2

像天然氣價格這樣的事情會使用額外的「規模」職位。你已經看到每加侖1.959美元的天然氣了,對吧?