为了账号安全,请及时绑定邮箱和手机立即绑定

转到采购/财务计算类型

转到采购/财务计算类型

Go
斯蒂芬大帝 2021-08-16 19:47:03
我正在用 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 表示瑞士法郎,美分表示欧元,等等。

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


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信