我正在Go建立一个在线商店。正如所料,一些重要的部分需要记录确切的货币金额。我知道与浮点数相关的舍入问题(即0.3无法准确表示等)。
货币的概念似乎很容易表现为一个字符串。但是,我不确定哪种类型最适合表达实际的货币金额。
关键要求似乎是:
我知道math / big.Rat它似乎解决了很多这些问题,但是例如它的字符串输出不会按原样运行,因为它将以“a / b”形式输出。我确信也有解决方案,但我想知道是否存在某种现有的最佳实践,我不知道(无法轻易找到)这类事情。
更新:这个包很有前途:https://code.google.com/p/godec/
答案 0 :(得分:5)
你应该保持i18n与货币实施脱钩。所以不,不要将所有内容捆绑在一个结构中并将其称为一天。标记金额代表的货币,但仅此而已。让i18n处理格式化,字符串化,前缀等。
使用math/big.Rat
之类的任意精度数字类型。如果这不是一个选项(因为序列化限制或其他障碍),那么使用最大的固定大小整数类型,您可以用来表示您所代表的任何货币的原子货币数量 - 美元的分数,日元的日元,兑换瑞士法郎,兑换欧元,等等。
当使用第二种方法时,要特别注意不要引起溢出,并为分割定义明确且有意义的舍入行为。