我研究过并发现,在处理货币时,进行计算的最佳方法是BigDecimal
类。
考虑到这一点,我正在制定一个代码,将各种类型的外币兑换成美元货币,反之亦然(具体而言,是一种采用外币并将其兑换成美元货币的现金登记,计算变化并返回这相当于客户的外币)。
截至目前,许多方法都使用double
,其中两个方法将int
作为参数用于计算美国货币。
问题:
由于我想在计算中使用BigDecimal类,我是否应该将所有涉及双精度计算的方法更改为BigDecimal?
答案 0 :(得分:4)
是的,您应该更改所有浮点数或双精度数以采用整数,长整数或BigDecimals
。
浮动和双打对于财务计算来说并不准确。使用Money
模式处理金额和货币(这是Quantity
的特殊类型)是一个非常好的主意。要维护可能包含多种货币的货币清单,您实际执行的是MoneyBag
,Money
的集合,然后可以将给定目标货币和CurrencyExchangeService
的所有值相加(货币兑换率也应存储为BigDecimals
)。
应根据所需的小数位数和舍入算法在每次操作后进行舍入。小数位数通常是Currency
的属性(例如,在ISO 4217处);除非需要不同的数字(例如,在定价汽油时)。
你一定要看看福勒的例子;但我也为Money
创建了一个非常简单的单一货币exercise类。它仅使用美元并舍入到小数点后2位;但它仍然是未来扩展的良好基础。
答案 1 :(得分:1)
是的,BigDecimal肯定是正确的方法(浮点几乎从不)。也在JDBC中。
但话虽如此,圆角存在问题。在某些情况下,欧洲软件法律要求6位小数。一般来说,你会希望在每一步中围绕2个位置。如果您有2位小数和一个价格的数量,您将得到4位小数,并且必须舍入。因此,为了使丑陋的BigDecimal接口更加丑陋,您可能需要一些帮助函数(multiplyRounded?)。