Euler数java中的精度

Euler数java中的精度,java,Java,我正在做一个计算欧拉数的代码,但精度不高。如果我的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; } double e=1; 对于(

我正在做一个计算欧拉数的代码,但精度不高。如果我的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;
      }
double e=1;
对于(int i=1;i<18;i++)
{
双j=(双)(E.阶乘(i));
双k=1/j;
e=e+k;
}

您应该用
BigDecimal
替换
double
。这将使代码更加精确

BigDecimal e = 0;
BigDecimal demo = 1;
    for (int i = 1; i < 400; i++) {
        e += demo;
        demo /= i;
}
bigdecime=0;
BigDecimal=1;
对于(int i=1;i<400;i++){
e+=演示;
demo/=i;
}

使用BigDecimal而不是double。

解决方案:

在这里,您可以在MathContext('precision',..)中设置精度

final static int LASTITER=17;
公共静态void main(字符串[]args){
MathContext mc=新的MathContext(20,取整模式,半向上);
BigDecimal结果=BigDecimal.0;

对于(int i=0;i我认为,
E.factorial
返回
long
作为结果,为了提高精度,请尝试以下代码:

    double e = 0;
    double tmp = 1;
    for (int i = 1; i < 400; ++i) {
        e += tmp;
        tmp /= i;
    }
double e=0;
双tmp=1;
对于(int i=1;i<400;++i){
e+=tmp;
tmp/=i;
}

只要原语类型double的最大值只能为“1.7976931348623157e+308”(64位精度),您就需要使用BigDecimal才能达到精度


使用
BigDecimal
代替建议的
double
,对于超过常规数据类型中可容纳的最大值的数字精度,您应该使用BigDecimal。尽管如此,我不确定您的E.factorial(I)是否函数由您控制,所以您可能很难适应使用BigDecimal。
    double e = 0;
    double tmp = 1;
    for (int i = 1; i < 400; ++i) {
        e += tmp;
        tmp /= i;
    }