C++格式化输出和精度控制
setw()
cout
提供了一种指定每个号码使用的最小空格数量的方法。流操作符 setw
可用于建立指定宽度的打印区域。以下是其用法示例:
int main()
{
int value = 23;
cout << setw(5) << value;
}
单词 setw
后面括号内的数字表示紧随其后的值的字段宽度。字段宽度是屏幕上打印值的字符位置或空格的最小数量。在此示例中,数字 23 将显示在 5 个空格的字段中。
为了进一步解释其工作原理,请看以下语句:
int main()
{
int value = 23;
cout << "(" << setw(5) << value << ")";
}
输出结果:
( 23)
请注意,这个数字占据了字段的最后两个位置。由于这个数字没有使用整个字段,所以 cout
用空格填充了额外的 3 个位置。因为这个数字出现在字段的右侧,空格“填充”在前面,所以它被认为是右对齐的。
默认是右对齐的,std::right
如果要左对齐输出,只需要插入 std::left
#include <bits/stdc++.h>
using namespace std;
int main()
{
int value1 = 123;
int value2 = 12;
int value3 = 1;
cout << setw(5) << value1 << "\n";
cout << setw(5) << value2 << "\n";
cout << setw(5) << value3 << "\n";
cout << left << setw(5) << value1 << "\n";
cout << left << setw(5) << value2 << "\n";
cout << left << setw(5) << value3 << "\n";
}
输出结果:
123
12
1
123
12
1
请注意,setw
操作符要与每个值一起使用,这是因为 setw
**只为紧随其后的值建立一个字段宽度。**打印该值后,cout
将回到其默认的打印方式。如果数字太大导致字段无法完全容纳,那会怎么祥呢?如下列语句所示:
int main()
{
int value = 12345;
cout << "(" << setw(2) << value << ")";
}
输出结果:
(12345)
在这种情况下,cout
将打印整个数字,因为 setw
**只指定了打印字段中最少的位置数。**任何需要比指定最小值大的字段的数字将导致 cout
覆盖 setw
值。
- 浮点数的字段宽度包括小数点的位置。
- 字符串的字段宽度包括字符串中的所有字符,包括空格。
- 默认情况下,该字段中打印的值为右对齐。这意味着它与打印字段的右侧对齐,并且必要时在值前填充空格。
setfill()
声明:setfill (char_type c);
setw()
默认填充的内容为空格,可以 setfill()
配合使用设置其他字符填充。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int value1 = 123;
int value2 = 12;
int value3 = 1;
cout << setfill('@') << setw(5) << value1 << "\n";
cout << setfill('#') << setw(5) << value2 << "\n";
cout << setfill('*') << setw(5) << value3 << "\n";
}
输出结果:
@@123
###12
****1
setprecision()
#include <bits/stdc++.h>
using namespace std;
int main()
{
double value = 123.456;
cout<<value<<endl;
cout<<setprecision(7)<<value<<endl;
cout<<setprecision(6)<<value<<endl;
cout<<setprecision(5)<<value<<endl;
cout<<setprecision(4)<<value<<endl;
cout<<setprecision(3)<<value<<endl;
cout<<setprecision(2)<<value<<endl;
cout<<setprecision(1)<<value<<endl;
}
输出结果:
123.456
123.456
123.456
123.46
123.5
123
1.2e+02
1e+02
请注意,与 setw
不同的是,setprecision
不计算小数点。例如,当使用 setprecision(6)
时,输出包含 5 位有效数,但是需要 7 个位置来显示 123.456
数 字 | 操作符 | 显示的值 |
---|---|---|
28.92786 | setprecision(3) | 28.9 |
21.40 | setprecision(5) | 21.4 |
109.50 | setprecision(4) | 109.5 |
34.78596 | setprecision(2) | 35 |
setw
和setprecision
结合使用
#include <bits/stdc++.h>
using namespace std;
int main()
{
double value1 = 123.456;
double value2 = 12.3456;
double value3 = 1.23456;;
cout<<setprecision(5);
cout<<setw(8)<<value1<<endl;
cout<<setw(8)<<value2<<endl;
cout<<setw(8)<<value3<<endl;
}//允许显示最多 5 个有效数,并以 8 个字符的字段宽度右对齐打印
输出结果:
123.46
12.346
1.2346
fixed()
如果一个数字太大,无法使用 setprecision
指定的有效数位数来打印,则许多系统会以科学表示法的方式打印
为了防止出现这种情况,可以使用另一个流操作符 fixed
,它表示浮点输出应该以固定点或小数点表示法显示
还是之前的程序:
fixed 操作符与 setprecision
操作符一起使用时,setprecision
即可以以一种新的方式显示。它将指定浮点数字的小数点后要显示的位数,而不是要显示的总有效数位数。而这通常正是我们想要的。
int main()
{
double value = 123.456;
cout<<fixed;
cout<<value<<endl;
cout<<setprecision(7)<<value<<endl;
cout<<setprecision(6)<<value<<endl;
cout<<setprecision(5)<<value<<endl;
cout<<setprecision(4)<<value<<endl;
cout<<setprecision(3)<<value<<endl;
cout<<setprecision(2)<<value<<endl;
cout<<setprecision(1)<<value<<endl;
}
输出结果:
123.456000//默认6位小数
123.4560000
123.456000
123.45600
123.4560
123.456
123.46
123.5
setbase()
将数字转换为 n 进制(只能指定转换成8,10,16进制)
声明:setbase (int base);
参数:
base
使用的数字基数的值,如下所示
编号 | base参数和插入相样 |
---|---|
1 | 8 oct |
2 | 10 dec |
3 | 16 hex |
返回值:返回未指定类型的对象。