用整数/BigInteger还是BigDecimal来表示金钱?

4
几年前,我参与编写了一个处理货币和保险的应用程序。最初,我们使用浮点数来表示货币(我知道这是大忌)。大部分应用程序只涉及加减值,因此没有任何问题。然而,特定部分涉及货币价值的百分比,因此需要乘除法。
我们立即遭遇了浮点错误,并进行了重大重构。我们使用了一个任意精度库来解决这个问题。然而,这并没有改变你可能会得到一分钱的事实。那么你该如何舍入呢?简短的答案是“这很复杂”。
现在我准备开始开发一个类似的应用程序来替换旧的应用程序。我已经思考了多年。我一直认为创建一个货币数据类型,它包装一个整数(或BigInteger)来表示便士数量,并提供一个将其打印成传统的、人性化的$0.00格式的函数是最容易的。
然而,经过研究,我发现最近实施的Java Money API JSR 354。令人惊讶的是,它使用BigDecimal来支持货币表示,并因此包含特定的舍入逻辑。
在计算中携带一分钱的分数有什么优势?为什么我要这样做,而不是说一分钱是货币的“原子”形式?

因为它不是这样的。我今天购买了一些价格带有分数美分的物品。 - user207421
你熟悉千分税率吗?或者汽油价格 - Elliott Frisch
1个回答

5
这是一个广泛的问题,因为它的答案取决于具体实现。
如果我以$5的价格批量购买1000件商品,那么每件商品的单价将低于你所说的“货币的最小单位”$0.01。
如果我们认为$0.01是最低可能的金额,那么在特定情况下我们将无法进行计算,就像我的例子一样。
因此,JavaMoney API处理许多小数位,确保在这些情况下不会失去精度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接