去购买/财务计算的类型

Bra*_*ody 4 bigdecimal go 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/

thw*_*hwd 5

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

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

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