BigDecimal和Money

时间:2012-03-31 20:13:04

标签: java bigdecimal

我研究过并发现,在处理货币时,进行计算的最佳方法是BigDecimal类。

考虑到这一点,我正在制定一个代码,将各种类型的外币兑换成美元货币,反之亦然(具体而言,是一种采用外币并将其兑换成美元货币的现金登记,计算变化并返回这相当于客户的外币)。

截至目前,许多方法都使用double,其中两个方法将int作为参数用于计算美国货币。

问题:

由于我想在计算中使用BigDecimal类,我是否应该将所有涉及双精度计算的方法更改为BigDecimal?

2 个答案:

答案 0 :(得分:4)

是的,您应该更改所有浮点数或双精度数以采用整数,长整数或BigDecimals

浮动和双打对于财务计算来说并不准确。使用Money模式处理金额和货币(这是Quantity的特殊类型)是一个非常好的主意。要维护可能包含多种货币的货币清单,您实际执行的是MoneyBagMoney的集合,然后可以将给定目标货币和CurrencyExchangeService的所有值相加(货币兑换率也应存储为BigDecimals)。

应根据所需的小数位数和舍入算法在每次操作后进行舍入。小数位数通常是Currency的属性(例如,在ISO 4217处);除非需要不同的数字(例如,在定价汽油时)。

你一定要看看福勒的例子;但我也为Money创建了一个非常简单的单一货币exercise类。它仅使用美元并舍入到小数点后2位;但它仍然是未来扩展的良好基础。

答案 1 :(得分:1)

是的,BigDecimal肯定是正确的方法(浮点几乎从不)。也在JDBC中。

但话虽如此,圆角存在问题。在某些情况下,欧洲软件法律要求6位小数。一般来说,你会希望在每一步中围绕2个位置。如果您有2位小数和一个价格的数量,您将得到4位小数,并且必须舍入。因此,为了使丑陋的BigDecimal接口更加丑陋,您可能需要一些帮助函数(multiplyRounded?)。