c++的I/O流格式化输出怎么做 控制精度和对齐【cout技巧】

setprecision(n) 单独使用控制有效数字位数,搭配 fixed 控制小数点后位数;例如 setprecision(3) 输出 12.3(3 位有效数字),加 fixed 后输出 12.346(小数点后 3 位)。

cout 做格式化输出,关键靠 iomanip 头文件里的操纵符(manipulators),它们能直接“插”进输出流,临时改变行为,不用写一堆 printf 风格的格式串,也比手动拼字符串更安全清晰。

控制小数位数和精度:setprecision + fixed/scientific

setprecision(n) 控制的是「有效数字位数」还是「小数点后位数」,取决于是否搭配 fixedscientific

  • 单独用 setprecision(3):对 12.3456 输出 12.3(3 位有效数字)
  • fixed:强制小数点后保留 n 位,cout → 12.346
  • scientific:科学计数法下小数点后保留 n 位,cout → 1.23e+03

注意:fixedscientific 是“开关”,设了之后会持续生效,直到被另一个覆盖或用 defaultfloat 恢复。

设置字段宽度和对齐方式:setw、left、right、internal

setw(n) 只对「下一个输出项」起作用,指定最小占位宽度(不足补空格);对齐需配合 left / right / internal

  • right(默认):内容右对齐,空格填左边
  • left:左对齐,空格填右边
  • internal:符号/前缀(如负号、0x)靠左,数值靠右,中间填空格(常用于带符号数字或十六进制)

例如:cout 输出 42 | 42

填充字符和进制切换:setfill、hex、oct、dec

setfill(c) 设定填充字符(默认空格),效果持续到下次再设;hex/oct/dec 切换整数输出进制:

  • cout → 0042
  • cout → ff 377 255
  • showbase 可显示进制前缀:showbase → 0xff

常见组合示例(实用小片段)

打印表格式浮点数据:

cout << fixed << setprecision(2) << setfill(' ') << left << setw(10) << "Name"
     << right << setw(8) << "Score" << setw(10) << "Time\n";
cout << setw(10) << "Alice" << setw(8) << 95.5 << setw(10) << 12.34 << '\n';

输出带符号、补零的十六进制地址:

cout << showbase << internal << setfill('0') << hex;
cout << setw(10) << -256; // 输出: -00000100