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