无论我尝试了什么,下面的代码抛出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
个数字上完美运行,但是当涉及到更高的值时,它会崩溃。
答案 0 :(得分:2)
由于行
而发生异常.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
这里你没有给出一个精确的刻度,这意味着可以获得一个无限长的十进制扩展,例如将1除以3时。
要解决错误,您需要放入舍入比例和舍入模式。
E.g:
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)
答案 1 :(得分:1)
在这里使用BigDecimal没有帮助,你必须在进行乘法后执行除法,在这种情况下你的算法适用于BigInteger。