欧拉数精度java

时间:2014-07-23 11:52:39

标签: 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;
      }

4 个答案:

答案 0 :(得分:1)

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

BigDecimal e = 0;
BigDecimal demo = 1;
    for (int i = 1; i < 400; i++) {
        e += demo;
        demo /= i;
}

Docs.oracle refer to this.

答案 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