【问题标题】:Error while calculating Catalan number sequence计算加泰罗尼亚数字序列时出错
【发布时间】: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.

标签: java math catalan


【解决方案1】:

异常发生是因为行

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

这里你没有给出精确的比例,这意味着可以得到一个无限长的小数展开,例如当 1 除以 3 时。

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

例如:

.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,您必须修复一些其他错误:new BigDecimal(catalan(n - 1)) 应该只是 catalan(n - 1),并且您应该返回 BigDecimal.ONE 而不是 BigInteger。一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多