无论我尝试什么,下面的代码都会抛出 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
数字上完美运行,但当涉及到更高的值时它会崩溃。
最佳答案
异常是因为行
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
这里你没有给出精确的刻度,这意味着可以得到无限长的小数展开,例如当 1 除以 3 时。
要解决错误,您需要输入舍入比例和舍入模式。
例如:
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)
关于java - 计算加泰罗尼亚数字序列时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49151390/