用于财务计算和非终止计算的Bigdecimal

sas*_*uke 4 java bigdecimal

我相信这将是一个简单的问题,但我不能为我的生活决定必须做些什么.所以这就是它:假设我们遵循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));
}
Run Code Online (Sandbox Code Playgroud)

但是众所周知,这个特定的代码片段会抛出,ArithmeticException因为除法是非终止的.在计算过程中使用无限精度数据类型时,如何在代码中处理这种情况?

TIA,
佐助

更新:鉴于这RoundingMode有助于解决这个问题,下一个问题是,为什么100.0/3不是33.33而不是33.3?难道33.33不是一个"更准确"的答案,因为你期望33美分而不是30美分吗?有什么方法可以调整吗?

kro*_*ock 7

答案是使用BigDecimal.divide()指定a 的方法之一RoundingMode.

例如,以下使用舍入模式的半偶数或银行家舍入(但根据要求,一半或其他一种舍入模式可能更合适)并将舍入到小数点后两位:

bd1.divide(bd2, 2, RoundingMode.HALF_EVEN);
Run Code Online (Sandbox Code Playgroud)