用整数表示钱/ BigInteger对比BigDecimal

时间:2017-05-18 16:17:37

标签: java currency arbitrary-precision

几年前,我帮助编写了一份处理金钱和保险的申请。最初,我们用浮点数代表货币(我知道这是一个很大的禁忌号)。大多数应用程序只是添加和减去值,所以没有任何问题。但是,具体部分涉及货币价值的百分比,因此是乘法和除法。

我们立即开始遭遇浮点错误,不得不做一个重大的重构。我们使用了一个任意精度库来解决这个问题。然而,它并没有改变你最终只能获得一分钱的事实。你怎么回事呢?简短的回答是“it's complicated。”

现在我已准备好开始研究类似的应用程序以取代旧的应用程序。多年来我一直在考虑这个问题。我一直认为最简单的方法是创建一个包含整数(或BigInteger)的money数据类型,以表示具有将其打印为传统的,人性化$0.00格式的函数的便士数。

然而,研究这个,我发现JSR 354,最近实现的Java Money API。我惊讶地发现它用BigDecimal支持它的代表钱。因此,它包括用于舍入的特定逻辑。

在计算中携带一分钱的优势是什么?为什么我要这样做,而不是说一分钱是“原子”形式的钱?

1 个答案:

答案 0 :(得分:5)

这是一个广泛的问题,因为它的答案因其实施而有所不同。

如果我以5美元的价格批量购买1000件物品,那么每件物品的单独售价为0.005美元,低于您声称的原子形式#34;钱,0.01美元。

如果我们认为0.01美元是可能的最低金额,那么我们就无法在特定情况下处理计算,例如我的例子中的计算。

因此,JavaMoney API处理许多小数位数,确保在这种情况下不会丢失精度。