Java 计算加泰罗尼亚数字序列时出错

Java 计算加泰罗尼亚数字序列时出错,java,math,catalan,Java,Math,Catalan,无论我尝试了什么,下面的代码都会在较大的数字(如43、50、56等)上抛出带有消息“非终止十进制扩展;没有精确表示的十进制结果”的算术异常 代码如下: private BigDecimal catalan(int n) { if (n <= 1) { return BigInteger.ONE; } return BigDecimal.valueOf(4) .multiply(BigDecimal.valueOf(n))

无论我尝试了什么,下面的代码都会在较大的数字(如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)));
}
private双十进制加泰罗尼亚语(int n){

如果(n由于该行而发生异常

.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
这里你没有给出一个精确的刻度,这意味着可以得到一个无限长的十进制展开式,例如当1除以3时

要解决此错误,需要设置舍入刻度和舍入模式

例如:


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

为什么
n
不也是
BigInteger
?@FedericoklezCulloca,因为除法后的结果是(BigDecimal.valueOf(n).add(BigDecimal.ONE))有重要的小数点,如果没有小数点,我无法得到正确的结果。为什么
long
?它没有小数位数,在除法中,您将它转换为
BigDecimal
。这是正确的,可以使用intinstead@brack11我完全不明白
BigDecimal
s怎么会出现在你的代码中。加泰罗尼亚数字s是组合实体,总是自然的。所有中间步骤也应该对自然数执行,例如,
biginger
s。好吧,你必须修复一些其他错误:新的BigDecimal(catalan(n-1))应该是catalan(n-1),你应该返回BigDecimal.ONE而不是biginger.ONE
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)