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

为何setprecision无法得到精确小数?计算结果自动舍入问题咨询

关于C++中setprecision舍入行为的疑问

问题代码

#include <iostream>
#include <iomanip>

int main()
{
    int n;
    std::cin >> n;
    double sum = 0;

    for (int i = 1; i <= n; ++i)
    {
        sum += double(1.0 / i);
    }
    std::cout << std::setprecision(4) << std::fixed << sum;
}

当输入为10时,程序输出2.9290,但计算器计算结果显示2.9289,疑问在于setprecision为何自动舍入结果。


原因解析

1. 调和级数H₁₀的精确值

输入10对应的是第10项调和级数,精确值为:

H₁₀ = 1 + 1/2 + 1/3 + ... + 1/10 = 7381/2520 ≈ 2.928968254

可以看到,精确值的小数点后第五位是6,按照四舍五入规则,保留四位小数时应该进一位,得到2.9290。

2. setprecision配合fixed的行为

当使用std::fixed时,std::setprecision(4)的作用是保留小数点后4位数字,并且会对第5位数字执行四舍五入操作,而非直接截断。

你的程序中,double类型的sum存储的是接近精确值的浮点数(二进制浮点数虽有精度限制,但对于H₁₀的累加结果,误差极小,足够触发舍入),因此输出时会按照规则将2.928968...舍入为2.9290。

3. 计算器显示差异的原因

你看到的计算器结果2.9289,大概率是因为计算器采用了截断显示(直接舍弃第五位及之后的数字),或是计算器的精度设置较低,没有计算到足够的小数位数,导致没有执行舍入操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:05:00