首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Java更好地逼近e

用Java更好地逼近e
EN

Stack Overflow用户
提问于 2009-09-26 18:06:54
回答 8查看 8.2K关注 0票数 6

我想要将e的值近似到任何所需的精度。做这件事最好的方法是什么?我能得到的最多是e= 2.7182818284590455。任何关于修改以下代码的示例都将受到欢迎。

代码语言:javascript
复制
public static long fact(int x){
    long prod = 1;
    for(int i = 1; i <= x; i++)
        prod = prod * i;
    return prod;
}//fact

public static void main(String[] args) {
    double e = 1;
    for(int i = 1; i < 50; i++)
        e = e + 1/(double)(fact(i));
    System.out.print("e = " + e);
}//main
EN

回答 8

Stack Overflow用户

发布于 2009-09-26 18:10:22

使用BigDecimal而不是double。

代码语言:javascript
复制
BigDecimal e = BigDecimal.ONE;
BigDecimal fact = BigDecimal.ONE;

for(int i=1;i<100;i++) {
  fact = fact.multiply(new BigDecimal(i));

  e = e.add(BigDecimal.ONE.divide(fact, new MathContext(10000, RoundingMode.HALF_UP)));
}
票数 13
EN

Stack Overflow用户

发布于 2009-09-26 18:12:19

您的主要问题是double的精度非常有限。如果你想要任意的精度,你必须使用BigDecimal。你将遇到的下一个问题是long的有限范围,在阶乘中你很快就会超过这个范围--在那里你可以使用BigInteger

票数 6
EN

Stack Overflow用户

发布于 2009-09-26 18:19:03

您看过java.util.BigDecimal中的任意精度算法吗?

代码语言:javascript
复制
import java.math.BigDecimal;
import java.math.MathContext;
public class BigExp {
  public static void main(String[] args) {
BigDecimal FIFTY =new BigDecimal("50");
BigDecimal e = BigDecimal.ZERO;
BigDecimal f = BigDecimal.ONE;
MathContext context = new MathContext(1000);

for (BigDecimal i=BigDecimal.ONE; i.compareTo(FIFTY)<0; i=i.add(BigDecimal.ONE)) {
  f = f.multiply(i, context);
  e = e.add(i.divide(f,context),context);

  System.out.println("e = " + e);
}
  }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1481780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档