我正在用 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 表示瑞士法郎,美分表示欧元,等等。
使用第二种方法时要格外小心,不要引起溢出,并为除法定义清晰且有意义的舍入行为。
- 1 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消