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
相关产品推荐
相关产品推荐

