首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 計算自然常數 e:for 循環條件寫錯導致結果恆為 1.0

     編輯:程式設計疑難解答

錯誤代碼

for (int i = 1; factorial(i) < 1e-5; i++) {
    t /= i;
    e += t;
}

根因

factorial(i) 返回 long 階乘值(1, 2, 6, 24...),**永遠 ≥ 1**,絕不可能小於 1e-5。循環條件初始即為 false,**循環體零次執行**,直接輸出初始 e = 1.0。

正確邏輯:泰勒展開

e = Σ (1 / n!),當項值 1/n! < 1e-15 時停止(double 精度極限)。

修正代碼

public class EulerNumber {
    public static void main(String[] args) {
        double e = 1.0;
        double term = 1.0;
        for (int i = 1; ; i++) {
            term /= i;               // term = 1/i!
            if (term < 1e-15) break; // 項值足夠小則停止
            e += term;
        }
        System.out.println("e = " + e); // 2.7182818284590455
    }
}

關鍵點對比

錯誤寫法正確寫法
factorial(i) < 1e-5term < 1e-15 (判斷當前項值)
每次重新算階乘 O(n²)遞推 term /= i O(n)
循環零次執行至少執行 17 次達到 double 精度

進階:BigDecimal 高精度版

BigDecimal e = BigDecimal.ONE;
BigDecimal term = BigDecimal.ONE;
for (int i = 1; i < 100; i++) {
    term = term.divide(BigDecimal.valueOf(i), 50, RoundingMode.HALF_UP);
    e = e.add(term);
}
System.out.println(e); // 50 位精度

記住:**級數求和判斷「項值」,而非「階乘」**。改對條件,e 瞬間精確輸出!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved