C++ 格式化输出(前置补0,有效位数,保留小数,上下取整,四舍五入)

前言:ACM模式中,总会出现一些C++格式化输出的要求。如果不会那些特定的API,就会很吃亏。没有记录和整理,即使大一会了,大三又不会了。故整理几个常见的写法,日后给自己看。


测试环境: Dev C++ MinGW GCC10.2.0 32-bit Debug

1. 默认情况

我们先看C++默认的浮点数输出。

#include<iostream>
using namespace std;
int main(){
	cout << 0.123456789 << endl;//0.123457
	cout << 3.123456789 << endl;//3.12346
	cout << 33.23456789 << endl;//33.2346
} 

可以看出来,默认情况下浮点类型的输出有效位数为6,且会自动四舍五入

2. 前置补0

情景:计算某个时间,我们需要格式化输出时间HH:mm:ss。倘若时间不够10,则需要在前面补0。
小声BB:可能C++也有类似Java的SimpleDateFormat,but who care?

知识点:

  • 头文件iomanip
  • 输出控制符setw
    • 理解:set width设置输出宽度。
    • 作用范围:仅对后续的<<生效一次。所以输出一次用一次。
  • 输出控制符setfill
    • 理解:set fill character 设置填充的字符,不写参数的话默认是空格。
    • 作用范围:自设置之后的所有<<,直到下一个setfill才更改。所以用一次就好啦。

代码:

#include<iostream>
#include<iomanip>
using namespace std;

int main(){
	int hour = 5;
	int minute = 30;
	int second = 0;	
	cout << setw(2) << setfill('0') << hour <<":" 
		 << setw(2) << minute <<":"
		 << setw(2) << second << endl;
} 

这样就可以输出05:30:00的格式了。

此处的代码比较简单,需要额外注意,若setw(n)后接浮点数,则小数点也算一个宽度。若setw(n)后接的数值宽度大于n,则会全部输出。

float six = 123456;
float three = 12.3;
float mini = 0.123123;
cout << setw(4) << setfill('*') << six <<endl 
	 << setw(4) << three <<endl
	 << setw(4) << mini << endl;
/*输出如下 
	123456
	12.3
	0.1234
*/

3. 保留有效位数

  • 头文件iomanip
  • 输出控制符setprecision
    • 理解:可以设置输出精度。(总有效位数,包括整数部分)
    • 作用范围:同setfill,可以对后续的输出产生影响。

为了对比原本的输出和设置精度后的输出,后续的几个测试示例都是分开测试的。

float big = 12345;
cout << big <<" after " << setprecision(4) << big << endl;
//12345 after 1.234e+04
float middle = 1.2345;	
cout << middle <<" after " << setprecision(4) << middle << endl;
//1.2345 after 1.235
float mini = 0.12345;
cout << mini <<" after " << setprecision(4) << mini << endl;
//0.12345 after 0.1235

4. 保留小数

  • 头文件iomanip
  • 流操作符fixed
    • 理解:它表示浮点输出应该以固定点或小数点表示法显示。
    • 作用范围:之后所有。

fixed 操作符可能最重要的还是当它与 setprecision 操作符一起使用时,setprecision 即可以以一种新的方式显示。它将指定浮点数字的小数点后要显示的位数,而不是要显示的总有效数位数。而这通常正是我们想要的。
——摘自C语言中文网

代码如下:由于作用范围包括后面的,所以我们可以提前就设置好,后续输出即可。

cout << fixed << setprecision(4);	
float big = 12345;
cout  << big << endl;// 12345.0000
float middle = 1.2345;	
cout << middle << endl;// 1.2345
float mini = 0.12345;
cout << mini << endl;//0.1235

可以看出来,不管数值大小,最终都能以四舍五入保留4位小数。

5. 向下取整,向上取整,四舍五入

引入cmath头文件,利用ceil,floor,round函数可以实现该整型功能。

Tip:

  1. 若是需要保留2位小数时取整,则可以通过乘100,再取整,最后除100的方式实现。
  2. 通过强制类型转化可以实现向下取整。
float a = 12.3456;
//基本函数调用
cout<<ceil(a)<<endl;   //向上取整
cout<<floor(a)<<endl;   //向下取整
cout<<round(a)<<endl;   //四舍五入
//不使用函数实现
//向下取整
cout<<(int)a<<endl;
//向上取整
cout<<(a>(int)a?(int)a+1:(int)a)<<endl;
//四舍五入
cout<<(int)(a+0.5)<<endl;
  • 68
    点赞
  • 312
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如果皮卡会coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值