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

时间:2011-10-01 07:17:00

标签: 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));
}

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

TIA,
佐助

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

3 个答案:

答案 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)

这是一个例子,取决于你想要的四舍五入。