算完一组平均值,输出是 3.66667,交作业要求两位小数。直接用 cout 打印,小数点后面还是原样;加了 setprecision(2),结果变成 3.7,位数照样不对。

cout 要 fixed 和 setprecision 一起用

单独写 setprecision(2) 表示有效数字两位,不是小数两位。前面加 fixed,语义才变成小数点后保留几位,这是最容易混的一处。

#include <iostream> #include <iomanip> using namespace std; int main() { double v = 10.0 / 3; cout << fixed << setprecision(2) << v; return 0; }

输出 3.33。这两个设置会一直生效,后面所有浮点输出都按这个规则来。中途想恢复,再调一次 setprecision,或者用 resetiosflags 取消 fixed。

只想让某一行保留两位,就把 fixed 和 setprecision 写在那一行里,别在程序开头设一次然后忘了。

printf 的写法更短

习惯 C 风格的话用 printf,格式串写成 %.2f,两个参数:格式串在前,变量在后。格式串必须用英文双引号包住,写成中文引号直接编译不过。

这里要留神:printf 里不能塞 cout 的对象,两套混用容易顺序乱。要混就先刷新缓冲区,或者干脆只用一种。

四舍五入和截断不是一回事

前面两种写法都是四舍五入。3.335 这种临界值受二进制浮点表示影响,可能舍成 3.33 而不是 3.34,这不是写错了,是浮点数本身存不准。

做金额计算,先用整数按分来算,最后再转成小数输出,比在小数上反复调精度可靠得多。打印给人看和存进文件也是两件事,存文件建议多留几位,显示的时候再截。

还有个新手常踩的坑:整数除以整数,10/3 得到的是 3,不是 3.33。至少把一边写成 10.0,或者做一次强制类型转换。

要输出到字符串怎么办

不想直接打印,可以用 snprintf 写进字符数组,或者用 ostringstream 配 fixed 和 setprecision,最后取 str()。要拼一段文字再统一输出,后者更顺手。

选了哪种写法,整个项目统一。一半 printf 一半 cout,出问题时排查顺序能耗掉一晚上。