我正在做一个计算欧拉数的代码,但我没有很好的精度。如果我的i(变量到阶乘)是40,代码返回无穷大,但是,20或30代码返回正确的数字
我的代码
double e = 1;
for (int i = 1; i < 18; i++)
{
double j = (double)(E.factorial(i));
double k = 1 / j;
e = e + k;
}
答案 0 :(得分:1)
您应该将double
替换为BigDecimal
。这将使代码更精确。
BigDecimal e = 0;
BigDecimal demo = 1;
for (int i = 1; i < 400; i++) {
e += demo;
demo /= i;
}
答案 1 :(得分:1)
使用BigDecimal而不是double Documentation
解决方案:
这里你可以在MathContext上设置精度(&#39;精度&#39;,..)
final static int LASTITER = 17;
public static void main(String[] args) {
MathContext mc = new MathContext(20, RoundingMode.HALF_UP);
BigDecimal result = BigDecimal.ZERO;
for (int i = 0; i <= LASTITER; i++) {
BigDecimal factorial = factorial(new BigDecimal(i));
BigDecimal res = BigDecimal.ONE.divide(factorial, mc);
result = result.add(res);
}
System.out.println(result);
}
public static BigDecimal factorial(BigDecimal n) {
if (n.equals(BigDecimal.ZERO))
return BigDecimal.ONE;
else
return n.multiply(factorial(n.subtract(BigDecimal.ONE)));
}
来源:math
答案 2 :(得分:0)
我认为,E.factorial
返回long
作为结果,为了提高精度,请尝试以下代码:
double e = 0;
double tmp = 1;
for (int i = 1; i < 400; ++i) {
e += tmp;
tmp /= i;
}
答案 3 :(得分:0)
只要原始类型double只能具有“1.7976931348623157e + 308”(64位精度)的最大值,您需要使用BigDecimal才能实现精度
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html