使用BigDecimal计算Eulers数



我正试图通过对以下数字序列求和来制作一个近似e的程序:

e=1+(1/1!)+(1/2!)+(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<=执行计算(1/n!)2,但当n>=3时,我收到一条错误消息。这个程序似乎无法处理大于2的除数。程序的输出为:

e=2

e=2.5

线程"main"java.lang.AthmeticException中的异常:非终止十进制扩展;没有可精确表示的十进制结果。在java.math.BigDecimal.drif(未知源)ch10.Chapter_10_E20_Approximate.main(Chapter_110_E20_Aapproximate.java:16)

我应该如何使用BigDecimal类为e=1+(1/1!)+(1/2!)+(1/i!)?

众所周知,除以3得到一个具有十进制表示形式的数字,该数字将永远持续。

0.5 / 3 = 0.166666666666666666666666666666666666666666666666666666666666666666....

这就像BigDecimal内部的除法一样,只是正在计算二进制形式的int

您将需要一个不同的divide重载,该重载需要使用小数位数(小数点以外的小数位数)和舍入模式。这告诉BigDecimal要使用多少位数,以及停止时如何舍入。

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

输出e的最终估计值:

e = 2.71828182828616856395

出现此错误的原因是BigDecimal试图精确计算值,但它无法做到这一点,因为1/3在基数10中永远重复。

要解决此问题,您需要定义精度和舍入模式。例如:

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

最新更新