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

C++如何实现两位小数近似?setprecision(2)输出不符预期怎么办?

问题根因

这不是setprecision缺少配置导致的问题,本质是二进制浮点数的存储特性:

  • 十进制值123.455无法被double类型精确表示,内存中实际存储的数值约为123.454999999999993,比真实值略小
  • iostream默认的舍入规则在处理这个略小的值时,会判定第三位小数不足5,因此向下舍入输出123.45
修复方案

不需要新增iostream的格式化配置,只需要在输出前给待舍入的数值加一个极小的精度补偿值即可:

  • 补偿值需要远小于你要保留的最小精度,你要保留2位小数,最小精度单位是0.01,选1e-8作为补偿值不会影响正常数值的舍入结果,刚好抵消二进制存储带来的微小误差。

修正后代码:

#include <iomanip>
#include <iostream>

int main()
{
    double num1 = 123.455;
    constexpr double eps = 1e-8;
    std::cout << std::fixed << std::showpoint;
    std::cout << std::setprecision(2);
    std::cout << num1 + eps << std::endl;
    return 0;
}

运行上述代码即可得到预期的123.46输出。

注意:补偿值不要设置过大(建议不超过1e-4),否则会导致本该向下舍入的数值被错误进位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:51:19