我正在用 Go 建立一個在線商店。正如預期的那樣,幾個重要的部分需要記錄準確的貨幣金額。我知道與浮點數相關的舍入問題(即 0.3 不能精確表示等)。貨幣的概念似乎很容易僅表示為字符串。但是,我不確定哪種類型最適合表達實際貨幣金額。關鍵要求似乎是:可以根據貨幣精確表示小數到指定小數位數(某些貨幣使用超過 2 個小數位:http : //www.londonfx.co.uk/ccylist.html)顯然需要基本的算術運算 - add/sub/mul/div。理智的字符串轉換 - 這本質上意味著轉換為十進制等價物。此外,國際化至少需要是可能的,即使所有邏輯都不是內置的(歐洲為 1.000,美國為 1,000)。四舍五入,可能使用替代的四舍五入方案,如銀行家的四舍五入。需要有一個簡單而明顯的方法來對應一個數據庫值——在我的例子中是 MySQL。(在此級別將值視為字符串可能最有意義,以確保它的值被準確保留。)我知道 math/big.Rat 并且它似乎解決了很多這些問題,但例如它的字符串輸出不會按原樣工作,因為它將以“a/b”形式輸出。我確信也有解決方案,但我想知道是否有某種現有的最佳實踐,我不知道(不容易找到)這種事情。更新:這個包看起來很有希望:https : //code.google.com/p/godec/
1 回答

Cats萌萌
TA貢獻1805條經驗 獲得超9個贊
你應該讓 i18n 與你的貨幣實現脫鉤。所以不,不要將所有東西都捆綁在一個結構中并稱它為一天。標記該金額代表什么貨幣,僅此而已。讓 i18n 處理格式、字符串化、前綴等。
使用任意精度的數字類型,如math/big.Rat
. 如果這不是一個選項(由于序列化限制或其他障礙),則使用最大的固定大小整數類型,您可以使用您所代表的任何貨幣來表示原子貨幣的數量——美分代表美元,日元代表日元, rappen 表示瑞士法郎,美分表示歐元,等等。
使用第二種方法時要格外小心,不要引起溢出,并為除法定義清晰且有意義的舍入行為。
- 1 回答
- 0 關注
- 218 瀏覽
添加回答
舉報
0/150
提交
取消