去购买/财务计算的类型

时间:2014-09-24 03:22:27

标签: go bigdecimal financial

我正在Go建立一个在线商店。正如所料,一些重要的部分需要记录确切的货币金额。我知道与浮点数相关的舍入问题(即0.3无法准确表示等)。

货币的概念似乎很容易表现为一个字符串。但是,我不确定哪种类型最适合表达实际的货币金额。

关键要求似乎是:

  • 根据货币(某些货币使用超过2位小数:http://www.londonfx.co.uk/ccylist.html),可以精确地将十进制数字表示为指定的小数位数
  • 显然需要基本的算术运算 - add / sub / mul / div。
  • Sane字符串转换 - 这实际上意味着转换为它的十进制等值。此外,国际化至少可能是必要的,即使所有的逻辑都没有建立(欧洲为1.000,而美国为1,000)。
  • 舍入,可能使用像Banker四舍五入的替代舍入方案。
  • 需要一种简单明了的方式来对应数据库值 - 在我的情况下是MySQL。 (可能最有意义的是将值视为此级别的字符串,以确保其值得到完全保留。)

我知道math / big.Rat它似乎解决了很多这些问题,但是例如它的字符串输出不会按原样运行,因为它将以“a / b”形式输出。我确信也有解决方案,但我想知道是否存在某种现有的最佳实践,我不知道(无法轻易找到)这类事情。

更新:这个包很有前途:https://code.google.com/p/godec/

1 个答案:

答案 0 :(得分:5)

你应该保持i18n与货币实施脱钩。所以不,不要将所有内容捆绑在一个结构中并将其称为一天。标记金额代表的货币,但仅此而已。让i18n处理格式化,字符串化,前缀等。

使用math/big.Rat之类的任意精度数字类型。如果这不是一个选项(因为序列化限制或其他障碍),那么使用最大的固定大小整数类型,您可以用来表示您所代表的任何货币的原子货币数量 - 美元的分数,日元的日元,兑换瑞士法郎,兑换欧元,等等。

当使用第二种方法时,要特别注意不要引起溢出,并为分割定义明确且有意义的舍入行为。