2014-09-24 19 views
2

我正在Go中構建一家在線商店。如預期的那樣,一些重要的部分需要記錄確切的金額。我知道與浮動相關的四捨五入問題(即0.3不能完全表示等)。購買/財務計算的前往類型

貨幣的概念似乎很容易只是表示爲一個字符串。不過,我不能確定是什麼類型是最合適的表達在實際貨幣金額

的主要要求似乎是:

  • 可以準確地表達十進制數下降到指定數量的基於貨幣的小數位數(某些貨幣使用2位小數以下:http://www.londonfx.co.uk/ccylist.html
  • 明顯需要基本的算術運算 - add/sub/mul/div。
  • Sane字符串轉換 - 基本上意味着轉換爲它的十進制等值。而且,即使所有的邏輯不是內置的(歐洲爲1,000,美國爲1,000),國際化至少也應該是可能的。
  • 舍入,可能使用銀行家舍入等交替舍入方案。
  • 需要有一個簡單而明顯的方式來對應數據庫值 - MySQL在我的情況。 (可能最有意義的是把這個值當作一個字符串來處理,以確保它的值完全保留。)

我知道math/big.Rat,它似乎解決了很多這些東西,但例如它的字符串輸出不會按原樣工作,因爲它會以「a/b」形式輸出。我相信也有解決方案,但我想知道是否有某種現有的最佳實踐,我不知道(不容易找到)這種事情。

UPDATE:這個包看起來很有希望:https://code.google.com/p/godec/

+0

快速反應:認爲您確實需要一個'struct'類型,其中包括單位,文化(因爲歐元金額在不同國家以不同方式打印)和金額,可能是一個定點整數(例如,對於美元,美分或美分* 10;存儲的精度可能因國家而異,或者您總是可以使用4位數字來控制舍入誤差)。如果你想控制舍入,我認爲你必須通過方法選擇數學運算(例如,amt.Div(3)而不是amt.Units/= 3)。 – twotwotwo 2014-09-24 04:15:28

+0

存儲它自己有趣的事情;無論貨幣存儲在哪裏,您都可能需要*三個*數據庫列,金額,貨幣和金額在交易時粗略轉換爲客戶的標準貨幣。 – twotwotwo 2014-09-24 04:17:01

+0

我無法快速找到現有模型,但廣泛地說,我認爲您會想要自己實現一些東西,而且它更多[火和動作](http:// www。joelonsoftware.com/articles/fog0000000339.html)比聰明。 – twotwotwo 2014-09-24 04:22:16

回答

3

你應該保持國際化從貨幣實現分離。所以不,不要把所有的東西都捆綁在一個結構體中,並且每天都這麼叫。標記金額代表什麼貨幣,但沒有其他。讓i18n負責格式化,字符串化,前綴等操作。

使用任意精度數字類型,如math/big.Rat。如果這不是一個選項(由於序列化限制或其他障礙),那麼使用您可以用來代表原幣的數量的最大固定長度整數類型,您以美元表示的貨幣爲–美分,日元爲yens,瑞郎爲瑞郎,歐元爲美分等等。

當使用第二種方法時要特別小心,不要在溢出中產生並且爲劃分定義明確和有意義的舍入行爲。