Go 类型用于采购/财务计算

标签 go bigdecimal financial

我正在用 Go 构建一个在线商店。正如预期的那样,几个重要的部分需要记录确切的货币金额。我知道与 float 相关的舍入问题(即不能准确表示 0.3 等)。

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

关键要求似乎是:

  • 可以根据货币准确表达小数点后指定的小数位数(某些货币使用超过 2 位小数:http://www.londonfx.co.uk/ccylist.html)
  • 显然需要基本的算术运算 - add/sub/mul/div。
  • 合理的字符串转换 - 这实际上意味着转换为十进制等价物。此外,国际化至少需要是可能的,即使所有的逻辑都不是内置的(欧洲 1000 对美国 1000)。
  • 舍入,可能使用替代舍入方案,如银行家舍入。
  • 需要有一种简单明了的方法来对应数据库值——在我的例子中是 MySQL。 (在此级别将值视为字符串可能最有意义,以确保它的值得到准确保留。)

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

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

最佳答案

您应该使 i18n 与您的货币实现分离。所以不,不要将所有内容都捆绑在一个结构中并称之为一天。标记金额代表的货币,仅此而已。让 i18n 负责格式化、字符串化、前缀等。

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

当使用第二种方法时,要格外小心,不要发生溢出,并为除法定义一个清晰且有意义的舍入行为。

关于Go 类型用于采购/财务计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26008004/

相关文章:

unit-testing - 如果测试文件在 go 1.4 及以下版本的系统上运行,我该如何跳过它?

go - 在 Golang 中查找模式的字节偏移量

go - GO 中自定义类型的枚举

financial - 金融应用程序编程

R 数据表优化。 overdraw 财务数据

go - 为什么这两个结构在内存中的大小不同?

java - Java 的 BigDecimal 是否像 C++ 中的 long double 那样利用硬件架构?

java - 获取 BigDecimal 的第 n 位数字

java - BigDecimal 输出不包含精确的十进制值?

Kibana 毛利率加权平均值