【发布时间】:2018-03-07 11:58:19
【问题描述】:
无论我尝试什么,下面的代码都会抛出 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 数字上完美运行,但当涉及更高的值时,它会崩溃。
【问题讨论】:
-
为什么
n不是BigInteger? -
@FedericoklezCulloca 因为除法后的结果(BigDecimal.valueOf(n).add(BigDecimal.ONE)) 有重要的小数点,没有它我无法得到正确的结果
-
那为什么是
long?它没有十进制数字,并且在除法中您无论如何都将其转换为BigDecimal。 -
没错,可以用int代替
-
@brack11 我完全不明白
BigDecimals 是如何出现在您的代码中的。加泰罗尼亚数字是组合实体,并且总是自然的。所有中间步骤也应该在自然数上进行,例如BigIntegers.