gpt4 book ai didi

Java:BigDecimal 错误地给出除以 0 的错误

转载 作者:行者123 更新时间:2023-12-02 01:16:57 25 4
gpt4 key购买 nike

我尝试使用 BigDecimals 高精度计算欧拉数,但过了一段时间,数字变得如此小,以至于 JVM 抛出被 0 除的错误。关于如何克服的任何想法?我发现 try-catch block 总是在除法的 34 次迭代之后被调用,但我不知道为什么。欧拉数的公式是一个无限级数,因此 34 次迭代使其接近 e 的实际值,但不如我想要的那么准确。它实际上并没有除以 0,但它可能太小,JVM 无法区分。

    BigDecimal ee = BigDecimal.ZERO;
for (int k = 0; k < 50; k++) {
int fact = factorial(k);
try {
BigDecimal trial = BigDecimal.ONE.divide(BigDecimal.valueOf(fact), 100, RoundingMode.CEILING);
} catch (Exception e) {
System.out.println("---- Div-by-0 error; Iterated " + k + " times ----");
break;
}
ee = ee.add(BigDecimal.ONE.divide(BigDecimal.valueOf(fact), 100, RoundingMode.CEILING));
}
System.out.println("\n---- Final: \t\te = " + power(ee, x));
}

最佳答案

您的阶乘计算溢出。您的 factorial 方法必须返回 int,因为您已将该方法的返回值分配给 int

13开始发生溢出。 13!是 6,227,020,800,第一个阶乘值太大而无法用 int 表示。溢出将此值表示为 1932053504。当附加值变为负数时,问题会变得更糟,例如17!计算为-288522240

最终,足够的 2 因数在乘积中累积,所有 1 位都从末尾移出,留下 0(从 34 开始) !)。这就是导致除法为零错误的原因。

但这只是更早发生的溢出的症状。使用 BigDecimal 进行阶乘计算以避免溢出并保持精度。该 BigDecimal 可以直接传递给 divide 而无需转换。

关于Java:BigDecimal 错误地给出除以 0 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58420566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com