2010-09-22 46 views
14

哪種類型(浮點或小數)最適合用於在mysql數據庫中存儲價格?浮點或小數的價格?

+1

哪個數據庫?有些像甲骨文只有十進制 – Mark 2010-09-22 11:28:53

+0

請參閱[使用浮點數或小數的會計應用美元金額?](http://stackoverflow.com/questions/61872/use-float-or-decimal-for-accounting-application-dollar-amount 「堆棧溢出」)。 – Andrew 2010-09-22 11:32:36

+0

這是一個MySQL數據庫,但如果其他人之間有差異,我喜歡聽它。 – tom 2010-09-22 11:36:05

回答

32

浮點數不準確,可能引入累積舍入誤差。十進制是必須精確的財務信息的最佳格式。

+3

十進制也不準確 - 但它不是精確的我們期待的方式。 – 2010-09-22 11:49:11

+0

如果Michael的評論的含義不明確,請參閱下面的答案。 – MaxVT 2010-09-24 16:11:23

9

對於金融計算使用十進制

根據IEEE 754浮動總是二進制,只有新標準IEEE 754R定義十進制格式。許多分數二進制部分永遠不能等於精確的十進制表示。任何二進制數可以寫成m/2^n(m,n正整數),任何十進制數作爲m /(2^n * 5^n)。由於二進制數缺乏主要因子5,所有二進制數都可以用小數精確表示,但反之亦然。

0.3 = 3/(2^1 * 5^1) = 0.3 

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125] 

    1/4  1/8  1/16  1/32 

因此,對於金融計算使用十進制不浮動

0

請使用BigDecimal的,因爲它是最好的價格,因爲便士正確四捨五入到元。

Joshua Bloch建議BigDecimal。

+3

你是否在某處看到「java」標籤? – 2010-09-22 11:47:26

+0

@邁克爾你讓我! 。我用來尋找由java過濾新問題,所以我得到了這個問題。 – 2010-09-22 11:57:58

1

當我們存儲一個浮點數時,我們不保存確切的數字,這是一個近似值。整數部分獲得優先級,小數部分與類型大小相近。所以如果你有計算,並需要準確的結果使用十進制。

13

價格是十進制值,並在其上計算,預計表現得像小數,當談到四捨五入,文字等

這正是小數類型做。

花車存儲爲二進制分數,他們做而不是行爲像十進制分數 - 他們的行爲往往不是人們習慣於十進制數學期望。詳細解釋請參閱The Floating-Point Guide

對於貨幣值,永遠不要使用二進制浮點類型 - 尤其是當您有完美的十進制類型時!