我正在尝试编写一个程序,通过对以下数字系列求和来近似 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/