You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算自然常数e时int与double类型的差异问题

为什么double i时程序输出自然常数e的近似值,而int i时输出2?

首先看使用double i的代码:

#include <iostream>
using namespace std;
int main ()
{
    double s=0;
    double i=1;
    for (int m=1;m<5;m++)
    {
        i=m*i;
        s=s+1/i;
    }
    cout<<s+1;
    return 0;
}

这段程序输出的是自然常数e的近似值,而将i改为int类型时,输出结果为2:

#include <iostream>
using namespace std;
int main ()
{
    double s=0;
    int i=1;
    for (int m=1;m<5;m++)
    {
        i=m*i;
        s=s+1/i;
    }
    cout<<s+1;
    return 0;
}

你可能疑惑:存储结果的s是double类型,为什么i的类型会影响最终计算结果?原因在于除法运算的类型规则:

核心差异:浮点数除法 vs 整数除法

自然常数e的泰勒展开式为:

e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ...

你的循环m从1到4,本质是计算1 + (1/1! + 1/2! + 1/3! + 1/4!),这正是e的近似值。

  1. 当i是double类型时:
    1/i执行的是浮点数除法,能完整保留小数部分:

    • m=1:i=1*1=1 → 1/i=1.0 → s=1.0
    • m=2:i=2*1=2 → 1/i=0.5 → s=1.5
    • m=3:i=3*2=6 → 1/i≈0.1667 → s≈1.6667
    • m=4:i=4*6=24 → 1/i≈0.0417 → s≈1.7083
      最后s+1≈2.7083,这就是e的近似值(e≈2.71828)。
  2. 当i是int类型时:
    1/i执行的是整数除法——C++中两个整数相除,结果会直接舍弃小数部分,只保留整数:

    • m=1:i=1*1=1 → 1/1=1 → s=1.0
    • m=2:i=2*1=2 → 1/2=0(小数部分被舍弃)→ s仍为1.0
    • m=3:i=3*2=6 → 1/6=0 → s还是1.0
    • m=4:i=4*6=24 → 1/24=0 → s依旧1.0
      最后s+1=2.0,所以输出2。

关键结论

虽然s是double类型,但1/i的计算结果类型由i的类型决定:整数除法得到的int结果会被隐式转换为double,但此时小数部分已经丢失,最终导致两种情况的输出差异。

内容的提问来源于stack exchange,提问作者mahmoud mirghani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:20:35