Java 用整数/BigInteger与BigDecimal表示货币

Java 用整数/BigInteger与BigDecimal表示货币,java,currency,arbitrary-precision,Java,Currency,Arbitrary Precision,几年前,我帮助编写了一个关于金钱和保险的应用程序。最初,我们用浮点数来表示货币(我知道这是一个很大的禁忌)。大多数应用程序只是对值进行加减,所以没有任何问题。然而,具体部分涉及货币价值的百分比,因此是乘法和除法 我们立即开始遭受浮点错误的困扰,不得不进行重大重构。我们使用了一个任意精度的库来解决这个问题。然而,这并没有改变一个事实,那就是你最终可以得到一分钱。你怎么能绕过这个?简而言之,答案是” 现在,我准备开始开发一个类似的应用程序来取代旧的应用程序。多年来我一直在考虑这个问题。我一直认为,创

几年前,我帮助编写了一个关于金钱和保险的应用程序。最初,我们用浮点数来表示货币(我知道这是一个很大的禁忌)。大多数应用程序只是对值进行加减,所以没有任何问题。然而,具体部分涉及货币价值的百分比,因此是乘法和除法

我们立即开始遭受浮点错误的困扰,不得不进行重大重构。我们使用了一个任意精度的库来解决这个问题。然而,这并没有改变一个事实,那就是你最终可以得到一分钱。你怎么能绕过这个?简而言之,答案是”

现在,我准备开始开发一个类似的应用程序来取代旧的应用程序。多年来我一直在考虑这个问题。我一直认为,创建一个封装整数(或
biginger
)的money数据类型来表示便士的数量是最容易的,并使用一个函数将其打印为传统的、人性化的
$0.00
格式

然而,通过研究,我发现了最近实现的Java Money API。我惊讶地发现,它用
BigDecimal
支持货币表示。因此,它包含了舍入的特定逻辑


在你的计算中随身携带一分钱有什么好处?为什么我要这么做,而不是说一分钱是货币的“原子”形式呢?

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

如果我以5美元的价格批量购买1000件物品,那么每件物品的单独成本为0.005美元,这比你所说的货币的“原子形式”低0.01美元

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


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

因为它不是。我今天买的东西都是零碎的,你熟悉吗?还是价格?