java - 使用 BigDecimal 计算欧拉数

标签 java bigdecimal eulers-number

我正在尝试编写一个程序,通过对以下数字系列求和来近似 e:

e = 1 + (1/1!) + (1/2!) + (1/3!) .... + (1/i!)

目前,我的代码如下所示:

public static void main(String[] args) {

        BigDecimal one = new BigDecimal(1);
        BigDecimal e = new BigDecimal(1.0);
        BigDecimal divisor = new BigDecimal(1.0);

        for (int i =  1; i <= 12; i++) {

            divisor = divisor.multiply(new BigDecimal(i));
            e = e.add(one.divide(divisor));

            System.out.println("e = " + e);

        }
    }

对于 n <= 2,程序成功执行计算 (1/n!),但一旦 n >= 3,我就会收到一条错误消息。该程序似乎无法处理大于 2 的除数。该程序的输出是:

e = 2

e = 2.5

线程“main”中的异常 java.lang.ArithmeticException:非终止十进制扩展;没有精确可表示的十进制结果。在java.math.BigDecimal.divide(来源未知)在ch10.Chapter_10_E20_ApproximateE.main(Chapter_10_E20_ApproximateE.java:16)

我应该如何使用 BigDecimal 类对 e = 1 + (1/1!) + (1/2!) + (1/3!) .... + (1/i!) 进行求和?

最佳答案

众所周知,除以 3 会得到一个永远持续下去的十进制表示形式的数字。

0.5 / 3 = 0.166666666666666666666666666666666666666666666666666666666666666666....

这就像 BigDecimal 内部除法的情况一样,只不过计算的是二进制形式的 int

您将需要 different overload of divide需要使用比例(小数点之外的小数位数)和舍入模式。这告诉 BigDecimal 要使用多少位数字以及停止时如何舍入。

e = e.add(one.divide(divisor, 20, RoundingMode.HALF_EVEN));

输出的e的最终估计:

e = 2.71828182828616856395

关于java - 使用 BigDecimal 计算欧拉数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36751296/

相关文章:

hibernate - BigDecimal 未使用 JPA 正确保存在数据库中

c - 如何用C计算欧拉数的37位小数?

c - 我的 C 代码 : wrong value output when I try to calculate Euler's number, e 有什么问题?

java.lang.IllegalArgumentException : 'value' belongs to a different Realm

java - Apache 负载均衡器数据在多个应用程序之间同步

java - 如何使用服务帐户凭据将文件上传到 Google Team Drive 中的文件夹?

java - 通过 Clojure 和 JDBC 将 5,000,000 行移动到另一个 Postgresql 数据库

java - JPA自动BigDecimal转换

java - BigDecimal 四舍五入不四舍五入