1

无论我尝试了什么,下面ArithmeticException的代码都会抛出消息“非终止十进制扩展;没有精确的可表示的十进制结果。” 更大的数字(如 43、50、56 等)。

这是代码:

private BigDecimal catalan(int n) {
    if (n <= 1) {
        return BigInteger.ONE;
    }
    return BigDecimal.valueOf(4)
            .multiply(BigDecimal.valueOf(n))
            .subtract(BigDecimal.valueOf(2))
            .divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
            .multiply(new BigDecimal(catalan(n - 1)));
}

这种方法在小n数字上完美无瑕,但当涉及到更高的值时,它会崩溃。

4

2 回答 2

2

由于该行而发生异常

.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))

在这里,您没有给出精度刻度,这意味着可以获得无限长的十进制扩展,例如在将 1 除以 3 时。

要解决错误,您需要输入舍入比例和舍入模式。

例如:

.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)
于 2018-03-07T12:17:57.003 回答
1

在这里使用 BigDecimal 没有帮助,您必须在执行乘法后执行除法,在这种情况下,您的算法适用于 BigInteger。

于 2018-03-07T16:21:52.080 回答