BigDecimal和Money

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

考虑到这一点,我正在制定一个代码,将各种类型的外币兑换成美元货币,反之亦然(具体而言,是一种取货币并将其兑换成美元货币的现金寄存器,计算变化并将此金额返还给外币客户)。

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

题:

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

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

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

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

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

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

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