printf(“%*.*f“,m,n,num)引发的思考

今天碰巧碰到printf("%*.*f",m,n,num)这种用法,随后就通过浏览器搜索看网上其他人对这种用法有什么总结的。但是很遗憾,不知道是我搜的方式不对还是其他原因,我搜出来的帖子都不敬人意。最后通过参考这个网站(https://www.w3cschool.cn/c/c-function-printf.html)。并结合自己的实践总结出了这种用法。内容如下:

 

以printf("%*.*f",m,n,num)为模板,说明:

前面的*号表示小数点前要输出数的宽度(直白点说就是你小数点前数的位数),对应参数m。m决定你小数的整数部分输出多少位数。

  • 如果实际的小数的整数部分的位数 > m的宽度则按照实际的小数的整数部分输出
  • 如果实际的小数的整数部分的位数 < m的宽度则m多出的部分以空格补充                                                                                                                                                                          

后面的*号则是小数点后的精度(直白点说就是精确到小数点后多少位),对应参数n。n决定你小数点后的精度。

  • 如果n的精度 > 实际小数的精度则补0。
  • 如果n的精度 < 实际小数的精度则四舍五入。

 

 

#include <stdio.h>

/* 以下代码在DevC++编译器中验证 */
int main(void)
{
	double pi = 3.141592654589;
	int n=123456789;						 //作为输出的参照,这样方便看出有几个空格占位

	printf("f:%*.*f\n",20,14,pi);
	printf("f:%*.*f\n",20,15,pi);
	printf("f:%*.*f\n",20,16,pi);
	printf("n:%d\n\n",n);

	printf("f:%*.*f\n",0,0,pi);
	printf("f:%*.*f\n",0,0,123.141592654589);
	printf("f:%*.*f\n",1,0,123.141592654589);
	printf("f:%*.*f\n",1,0,pi);
	printf("f:%*.*f\n",2,0,pi);
    printf("f:%*.*f\n",5,0,pi);
	printf("f:%*.*f\n",2,1,pi);
    printf("f:%*.*f\n",4,1,123.141592654589);
	printf("n:%d\n\n",n);

	printf("f:%*.*f\n",0,15,pi);
	printf("f:%*.*f\n",1,15,pi);
    printf("f:%*.*f\n",4,6,pi);
	printf("f:%*.*f\n",15,15,pi);
    printf("f:%*.*f\n",3,3,pi);
	printf("n:%d\n\n",n);

	return 0;
}

输出:

 

经过上面的输出,我们可以很快总结出printf("%*.*f",m,n,num)的输出规则

规则:

  1. m的实际输出宽度 = m-n-1 (且m-n>1),这里还要注意就是如果m-n-1后得出的m宽度  < 实际小数的整数部分则按照原小数的整数部分输出。(图中的916行)
  2. m == 0 && n !=0   时,小数的整数部分按照原样输出,小数部分则按照n的精度输出
  3. m != 0 && n == 0  时,小数的整数部分按照m的宽度输出,不够的补空格。小数部分则不输出
  4. m == 0 && n == 0 时,小数的整数部分按照原样输出,小数部分则不输出。
  5. m == n && m != 0,n !=0 时,小数的整数部分按照原样输出,小数部分按照n的精度输出
  6. m != 0 && n != 0 && m != n时,满足1.前提下,小数的整数部分按照m宽度输出,小数部分按照n的精度输出



    由于本人能力有限,难免会有考虑不周的地方,所以如果有错误,欢迎的大家指出来。大家一起讨论。



     
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值