我确信这将是一个简单的问题,但我不能为我的生活决定必须做些什么。所以就是这样:假设我们遵循使用BigDecimal
进行财务计算的“最佳实践”,如何处理抛出异常的东西(计算)?
例如:假设,我必须分割“用户数量”以投资“n”个不同实体之间的债券。现在考虑用户提交100美元进行投资以分配3个债券的情况。等效代码如下:
public static void main(String[] args) throws Exception {
BigDecimal bd1 = new BigDecimal("100.0");
BigDecimal bd2 = new BigDecimal("3");
System.out.println(bd1.divide(bd2));
}
但是众所周知,这个特定的代码片段会抛出ArithmeticException
,因为除法是非终止的。在计算过程中使用无限精度数据类型时,如何在代码中处理这种情况?
TIA,
佐助
更新:鉴于RoundingMode
有助于解决这个问题,下一个问题是,为什么100.0 / 3不是33.33而不是33.3? 33.33不是一个“更准确”的答案,因为你期望33美分而不是30美分吗?有什么方法我可以调整一下吗?
答案 0 :(得分:7)
答案是使用指定BigDecimal.divide()
的RoundingMode
方法之一。
例如,以下使用舍入模式half even或银行家四舍五入(但根据要求,一半或其他一种舍入模式可能更合适)并将舍入到小数点后两位:
bd1.divide(bd2, 2, RoundingMode.HALF_EVEN);
答案 1 :(得分:2)
divide
有一个带有舍入模式的重载。你需要选择一个。我认为“半均匀”是最常用的货币计算方法。
答案 2 :(得分:1)
bd1.divide(bd2, 5, BigDecimal.ROUND_FLOOR)
这是一个例子,取决于你想要的四舍五入。