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-5 | term < 1e-15 (判斷當前項值) |
| 每次重新算階乘 O(n²) | 遞推 term /= i O(n) |
| 循環零次執行 | 至少執行 17 次達到 double 精度 |
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 瞬間精確輸出!