Java 使用BigDecimal计算欧拉数

Java 使用BigDecimal计算欧拉数,java,bigdecimal,eulers-number,Java,Bigdecimal,Eulers Number,我试图通过对以下数列求和来编制一个近似e的程序: e=1+1/1!+1 / 2! + 1 / 3! .... + 1/我 目前,我的代码如下所示: public static void main(String[] args) { BigDecimal one = new BigDecimal(1); BigDecimal e = new BigDecimal(1.0); BigDecimal divisor = new BigDecimal(1.

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

e=1+1/1!+1 / 2! + 1 / 3! .... + 1/我

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

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);

        }
    }
程序执行计算1/n!成功为n=3时,我收到一条错误消息。看起来这个程序无法处理大于2的除数。程序的输出为:

e=2

e=2.5

线程主java.lang.arithmetricException中的异常:非终止十进制扩展;没有可精确表示的十进制结果。在java.math.BigDecimal.dividech10处的未知源。Chapter_10_E20_ApproximateE.main Chapter_10_E20_ApproximateE.java:16


我应该如何使用BigDecimal类为e=1+1/1!+1 / 2! + 1 / 3! .... + 1/我

我们都知道,除以3得到一个十进制表示的数字,这个数字将永远持续下去

0.5 / 3 = 0.166666666666666666666666666666666666666666666666666666666666666666....
这与BigDecimal中的除法类似,只是二进制形式的整数正在被计算

您将需要一个使用小数点和舍入模式以外的小数位数的刻度。这会告诉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) );

实际上,除法通常需要精确的表示位数的总数。