2013-09-21 40 views
14

我已經注意到一些金融API像信用卡處理的條紋API要求數額作爲美分傳遞,這似乎是一個很好的簡化,它讓我想知道爲什麼我不在我的應用程序中的每一處都做同樣的事情我目前在我的Java代碼中使用數據庫NUMERIC無限長Postgres和BigDecimal,但我被存儲爲美分的簡單性所誘惑。將貨幣價值存儲爲美分/次要單位有什麼缺點?

  1. 存錢爲美分的缺點是什麼?
  2. 是否有具體的操作,難以與錢分錢?
  3. 存儲爲美分的貨幣是否適用於所有世界通用貨幣,或者如果 是其他特殊情況,那麼佔用不同貨幣的貨幣會變成一個巨大的混亂?
  4. 有沒有一個很好的java庫與 錢作爲美分?

UPDATE對於貨幣沒有美分,我們可以概括的問題存錢作爲一個貨幣的最小的小型單元,所以美分美元,不論是相等的其他貨幣。

+1

那些沒有相當於美分的貨幣呢? –

+2

也因爲有些情況下子便士交易有意義。 – R0MANARMY

+0

還有一些貨幣[沒有基數10個亞基](http://en.wikipedia.org/wiki/Non-decimal_currency) – Ben

回答

0

貿易通常以美元計算(1澳大利亞元= 0.94美元在發佈時)。說澳幣100澳分= 94美分是微不足道的,但有許多貨幣不存在美分。美分的主要優點是可以將值存儲爲整數,而美元必須存儲爲浮點或定點十進制值。

以美分(作爲整數)存儲貨幣值的缺點是可能發生舍入誤差。例如20澳大利亞分= 18.8美分。

對於有美分的貨幣,計算可能會很簡單,但很多時候您必須轉換爲美元(或主貨幣,非美元貨幣),因爲這是匯率基於。

就個人而言,我一直使用的主要貨幣超細分,他們更容易,更不容易合作,舍入誤差,並且更易於閱讀($ 150.50是很容易,15050¢閱讀。)

+6

小心使用浮點數,因爲錯誤會很快發生。在處理金錢時,使用花車通常被認爲是一個非常糟糕的主意。 – Kitsune

+1

僅僅因爲我們沒有美分,我們確實有便士。在一天結束時,所有貨幣都是不可或缺的。即硬幣,紙幣。如上所述,不要使用浮點數。人們對奇數錢非常敏感,因爲他們傾向於認爲如果將它們從一便士中剔除,那麼還有什麼會對你產生影響 –

+0

這就是爲什麼堅持使用主要貨幣(即匯率爲給出)。 – azz

5

缺點是你不能代表小數單位。如果您正在執行興趣計算或類似操作,則這是個問題。但是,如果您正在進行「真錢」交易,這個問題就會消失。

貨幣是非十進制的並不重要 - 只要存在最小單位,您可以使用它來表示任何其他金額。您可能需要更聰明一點,以便以可讀的格式顯示,如果相關的話,但這是一個單獨的問題。

事實上,使用最小單位可能會簡化執行轉換,因爲您可以計算出每個貨幣對的最小單位之間的轉換率。當然,一旦進入轉換率,您最終需要再次使用BigDecimal(或類似的)。

因此,總而言之,最好使用最小單位作爲您的面額,並且使用BigDecimal來處理小數部分(如果它們可能出現的話)。 不要使用IEEE浮點數,因爲它們不能正確表示所有十進制數。這會導致那些會讓某人不高興的錯誤。

2
  1. 存錢爲美分的缺點是什麼?

沒有那麼多。以美分存儲簡化了計算並使其精確。正如前面提到的那麼多次,絕不要把你的錢表示爲浮點數。

  1. 是否有具體的操作難以用錢分錢?

您最終需要將金額呈現給用戶。然後,這些值需要根據特定貨幣的格式進行格式化。

  1. 存儲爲美分的貨幣是否適用於所有的全球貨幣,或者是否考慮到不同的貨幣會成爲一個巨大的混亂,如果其他特殊情況?

在應用程序中使用實際貨幣和支持多種貨幣可能需要存儲貨幣在百分之一美分以支持貨幣,如CLF帶有4位小數位或BHD帶有3位小數位。見ISO-4217

  1. 有沒有一個好的java庫與錢作爲美分?

不是我所知道的。你在這樣的圖書館裏尋找什麼樣的支持?

相關問題