前言说明
我们用C++的cout
输出浮点数的时候,不像用printf
一样方便。有一定的自己的特点,也可以通过以下辅助的函数方法获得想要的输出方法式。
依赖头文件#include <iomanip>
直接使用cout
代码 | 输出 |
---|---|
cout << 1122334455.141592653589793 << endl; | 1.12233e+09 |
cout << 123.141592653589793 << endl; | 123.142 |
cout << 3.141592653589793 << endl; | 3.14159 |
cout << -3.141592653589793 << endl; | -3.14159 |
cout << 666666.666666 << endl; | 666667 |
cout << 123.000000123 << endl; | 123 |
cout << 123.0009 << endl; | 123.001 |
cout << 3.14 << endl; | 3.14 |
cout << 0.1234567 << endl; | 0.123457 |
cout << 0.0 << endl; | 0 |
观察输出我们可知,cout
对于浮点数的直接输出是默认6位有效数字。
- 取舍遵循四舍五入
- 整数多余6位采用科学计数法。
- 小数多余6位直接舍去。
- 若整数部分为0,则不作为有效位。
- (经计算后)小数部分若为0,也无效
- 负号不占数值位
#include <iomanip>
该表格摘自百度百科iomanip_百度百科 (baidu.com)
控制符 | 作用 |
---|---|
setbase(n) | 设置整数为n进制(n=8,10,16) |
setfill(n) | 设置字符填充,c可以是字符常或字符变量 |
setprecision(n) | 设置浮点数的有效数字为n位 |
setw(n) | 设置字段宽度为n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法表示 |
setiosflags(ios::left) | 输出左对齐 |
setiosflags(ios::right) | 输出右对齐 |
setiosflags(ios::skipws) | 忽略前导空格 |
以下我们定义一个**
const double PI = acos(-1.0);
**
setbase(n) 进制转换
通常应用与整数,只限于8,10,16
代码 | 输出 |
---|---|
cout << setbase(16) << 1234 << endl; | 4d2 |
cout << setbase(10) << 1234 << endl; | 1234 |
cout << setbase(8) << 1234 << endl; | 2322 |
cout << setbase(2) << 1234 << endl; | 1234 |
可见对于非法的进制,如2进制,默认无效,输出还是十进制
setprecision(n) 设置浮点数有效位
代码 | 输出 |
---|---|
cout << setprecision(1) << PI << endl; | 3 |
cout << setprecision(2) << PI << endl; | 3.14 |
cout << setprecision(10) << PI << endl; | 3.141592654 |
cout << setprecision(0) << PI << endl; | 3 |
cout << setprecision(1.9) << PI << endl; | 3 |
cout << setprecision(-1) << PI << endl; | 3.14159 |
可见若规定0位则会至少保留一位,若是浮点数则会默认floor()
,若是负数则视为不合法输出默认的6位
fixed + setprecision(n) 四舍六入五成双
代码 | 输出 |
---|---|
cout << fixed << setprecision(2) << 9.8249 << endl; | 9.82 |
cout << fixed << setprecision(2) << 9.82671 << endl; | 9.83 |
cout << fixed << setprecision(2) << 9.8350 << endl; | 9.84 |
cout << fixed << setprecision(2) << 9.83501 << endl; | 9.84 |
cout << fixed << setprecision(2) << 9.8250 << endl; | 9.82 |
cout << fixed << setprecision(2) << 9.82501 << endl; | 9.83 |
此时的setprecision
只限定小数部分的位数
(1)被修约的数字小于5时,该数字舍去;
(2)被修约的数字大于5时,则进位;
(3)**(5凑偶)**被修约的数字等于5时,要看5前面的数字
若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;
若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
setw 设定字段宽度
setfill(n) 设置字符填充
为了展示输出,此处将setw
和setfill
混合使用
代码 | 输出 |
---|---|
cout << setfill(’%’) << setw(20) << PI << endl; | %%%%%%%%%%%%%3.14159 |
cout << setfill(’%’) << setw(20) << left << PI << endl; | 3.14159%%%%%%%%%%%%% |
cout << setfill(’%’) << setw(2) << PI << endl; | 3.14159 |
可见字宽默认(right
)补前导空位,setfill
只有在有空位的时才填充,若setw
的设定没有该输出的数据长度大时,无效
scientific 科学计数法
代码 | 输出 |
---|---|
cout << scientific << PI << endl; | 3.141593e+00 |
cout << scientific << uppercase << PI << endl; | 3.141593E+00 |
cout << scientific << 333.141592653589793 << endl; | 3.331416e+02 |
cout << scientific << uppercase << 0.041592653589793 << endl; | 4.159265E-02 |
可见小数部分默认保留6位
skipws 忽略前导空格(输入)
相关资料 C++ 基本的输入输出 | 菜鸟教程 (runoob.com)
当从一个流进行读取时,跳过空白字符(spaces, tabs, newlines).
对应的有
noskipws
关闭skipws 标志
#include <iostream>
#include <iomanip>
using namespace std;
int main(void)
{
char ch1, ch2;
//cin已经默认启动skipws
//最直接的感受是:
//在输入这两个字符时,在第二个字符结束(即回车时)之前,无论输入多少空格,回车,tab都与最后的输入结果无关
cin >> ch1 >> ch2;
cout << ch1 << endl;
cout << ch2 << endl;
return 0;
}