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

C++打印数值时如何避免小数被自动四舍五入

C++输出浮点数避免自动四舍五入的解决方法

C++默认的浮点数输出舍入规则为四舍五入到最近值,你代码中3.12345678保留4位小数时,第5位小数为5,因此会自动进1得到3.1235,不符合预期的截断输出要求,可以通过以下两种方案解决:

方案1:手动截断小数位

通过数学运算直接截取指定长度的小数位,不会触发默认四舍五入规则,兼容性更强,需要引入<cmath>头文件:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main ()
{
     double num1 = 3.12345678;
     // 原代码此处漏写分号,需补上否则会编译报错
     int retain = 4;
     // 乘以10^4后向下取整,再除以10^4实现截断
     double truncated = floor(num1 * pow(10, retain)) / pow(10, retain);
     
     cout << fixed << setprecision(retain);
     cout << truncated << endl; // 输出3.1234

     return 0;
}

方案2:修改全局浮点数舍入规则

C++11及以上版本可以通过<cfenv>头文件的fesetround函数,将全局浮点数舍入规则修改为向零截断,无需额外做数学运算:

#include <iostream>
#include <iomanip>
#include <cfenv>

using namespace std;

int main ()
{
     double num1 = 3.12345678;
     // 设置舍入规则为向零截断
     fesetround(FE_TOWARDZERO);
     
     cout << fixed << setprecision(4);
     cout << num1 << endl; // 输出3.1234

     return 0;
}

注意事项

  • 若处理负数场景,floor函数会向下取整,例如-3.12345按方案1处理会得到-3.1235,如果需要统一向零截断,建议使用方案2,或者将floor替换为trunc函数。
  • 若对性能要求较高,也可以直接写死对应位数的乘数,例如保留4位时直接乘以10000,避免pow函数的运算开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:18:04