我正试图通过对以下数字序列求和来制作一个近似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) );