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

标签 java math catalan

无论我尝试什么,下面的代码都会抛出 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/

相关文章:

c++ - 为两个序列中第一个匹配项的距离之和提出一个最优算法

PHP Math 随机数计算

c# - 是否有已知的算法来查找 N 个元素中哪 K 个元素的总和最接近整数?

algorithm - 铁路轨道的排列(堆栈实现)

java - 为什么相同的 OpenGL 函数在 Clojure 中的性能与在 Java 中的性能如此不同?

java - 在这里调用实例方法好还是声明变量好?

java - 语法错误,插入 "EnumBody"以完成 EnumDeclaration

java - 如何在apachecamel中将csv转换为json

algorithm - 生成括号问题的闭包数法

algorithm - 关于来自 wiki 的加泰罗尼亚数字的表达