情形1:四舍五入问题
C语言四舍五入的原理分析
对 %3.3f 解读:
第一个3表示总位数,总位数=一位小数点+小数的位数+整数的位数,在本例中,小数点位数是1位,小数位数是3位,而整数位数小于1(所以要四舍五入,往下看),需要对整数的位数进行判断:3-1-3=-1<0,这时公式里的整数位数小于格式串里的整数位数,那么整数位数按实际长度输出,有多少整数位数就输出多少。整数有多少位就输出多少位。(这就是所谓的 “按位实际长度输出的理解”),因此,原来定义的a的整数位数是3,输出的整数位数就是3,
然后,因为格式串里的小数位数是3位,原来定义的a的小数位数是8位,此时输出的小数位数是3位,但要四舍五入。
因此,最终的输出结果是:
3.124
因为整数位输出3,接着输出一个小数点,再是四舍五入的3位小数位数。即得结果3.124

规律总结:
通过上述公式算得整数位数小于1,当整数位数是0,-1,-2,-3,-4,-5,依此类推时,采用四舍五入,且有几位小数就输出几位小数,整数有多少位就输出多少位。(这就是所谓的 “按位实际长度输出的理解”)见下图验证:
C语言四舍五入的原理分析
验证分析:
有两位整数1和2就按实际长度输出1和2,小数点原样输出,**公式里(总位数=一位小数点+小数的位数+整数的位数)**小数位有几位就输出几位,这里格式串中小数位数是3,所以输出3位小数位数。

也就是说,四舍五入的本质问题实际上是格式串里的的整数位数小于1的问题的讨论
分析完毕!

聪明的你,会不会猜到整数位数大于等于1会是什么情况呢?如下文所示:

情形2:左右对齐问题

C语言四舍五入的原理分析
对 %9.7f 解读:
第一个9表示总位数,总位数=1位小数点+7位小数+1位整数,在这个公式中,需要对整数的位数进行判断:9-1-7=1,这时整数部分,原来定义的a的整数位数是3,输出的整数位数就是3,
然后,因为格式串里的小数位数是7位,原来定义的a的小数位数是9位,此时输出的小数位数是7位,不需要四舍五入。因为整数位数大于等于1
因此,最终的输出结果是:
3.1234567
因为整数位输出3,接着输出一个小数点,再是输出7位小数位数。即得结果3.1234567

特别地:整数位数大于1时补空格
C语言四舍五入的原理分析
因为整数位数=总位数-小数位数-小数点位数,算得整数位数=9-3-1=5,5的含义是输出5位整数,但其中只有一个整数是3,不够5位,怎么办?空格来凑数。所以5-1=4,余下的四位补四个空格,充当缺少的4位整数。
因此输出结果是:
bbbb3.123
b表示一个空格。

#include<stdio.h>
main()
{	
	float a=12.123556789;
	int b=123456789;
	printf("%d\n",b);
	printf("%3.3f",a);
}

分析完毕!

相关文章: