Java:除以阶乘时,如何存储阶乘?它太大了,不能成双

标签 java series

我是 java 新手,我的程序可能远没有达到应有的效率,但它是:

public class Compute {
public static void main(String[] args) {
    for(double i = 10000; i <= 100000; i += 10000)
    {
        System.out.println("The value for the series when i = " + i + " is " + e(i));
    }
}
public static double e(double input) {
    double e = 0;
    for(double i = 0; i <= input; i++)
    {
        e += 1 / factorial(input);
    }
    return e;
}
public static double factorial(double input) {
    double factorial = 1;
    for(int i = 1; i <= input; i++)
    {
        factorial *= i;
    }
    return factorial;
}
}

我相信这会计算 i = 10000, 20000, ..., & 100000 时的值 e。
其中 e = 1 + (1/1!) + (2/2!) + ... + (1/i!)
这样做大约需要 47 秒,但我相信它有效。

我的问题是,对于每个 i,结果始终是 0.0
我相信这是因为每当调用阶乘方法时,返回值太大而无法存储,这会以某种方式导致问题。

如何存储 Factorial 方法返回的值?

最佳答案

尽管您可以使用 BigDecimal 计算任意精度结果,但对于 e 的级数展开,无需计算到 100000!。考虑到该系列中的第 20 项 (20/20!) 的大小约为 10-19,因此它对总体的贡献微不足道。

换句话说,第 20 位之后的任何项的贡献只会更改小数点后第 19 位之后的数字。

关于Java:除以阶乘时,如何存储阶乘?它太大了,不能成双,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19416849/

相关文章:

javascript - Highcharts 更改或添加 point.names 和 y 数组中名称的颜色

java - Mockito 超时验证在并发执行时意外失败

java - 系列代

python - 在 Pandas 中拆分和加入系列

python - 为什么我会收到一个错误,其中整数太大而无法在我的 Python 脚本中转换为 float ?

python - Pandas 系列过滤

java - Android 相机应用拍照后延迟

java - 使用 Java 只获取目录中的新文件

java - 在 Eclipse 中自动导入新的 Maven 模块

Java:从外部 .jar 获取类