C语言四舍五入的原理分析

清晰的笔记代表清晰的头脑。
之前写这篇文章,以为自己把这个话题说明白了,看评论区反馈,
按照费曼学习法,我没把这个东西说明白,反而是我自己没搞懂,
那么再优化一下,采用具体的场景

1. 四舍五入

1.0. c语言在线编辑工具

在线编译c语言工具
可以快速调试文章当中的C语言代码。
快速收到正确或错误的反馈。

1.1 什么是四舍五入?

结合数学知识,来看下面的数学问题:
什么是四舍五入?看下面的例子你就回忆起来了。
看例子来感觉一下,就不讲文字了,否则很枯燥。

/*要求保留1位小数
93.35 要求保留一位小数
那么此时依据四舍五入,应该向前一位进一,就是93.4
*/

我们来看这样的代码,是评论区伙伴摘自 c primer plus第六版中文版73页的例子。
代码及运行结果:
在这里插入图片描述

38522.99 —> 38523.0,
%3.1f告诉你,保留1位小数,看第二位是否比5大?如果是,就进1,所以就是38522.99 —> 38523.0。
这个逻辑大家都懂。

好,我要变身了
在这里插入图片描述

38522.99 —> 38522.99
%3.2f保留2位小数,因为只有2位小数,所有不会触发四舍五入的机制。【下一位没有无法进行四舍五入呀,没办法进1呀】
这个逻辑大家都懂。

再来看:
在这里插入图片描述
38522.99 —> 38523.0
%4.1f,你应该明白了,
保留1位小数,看第二位是否比5大?如果是,就进1,所以就是38522.99 —> 38523.0。

再来看:
在这里插入图片描述
%4.2f,你应该也明白了,
保留2位小数,因为只有2位小数,所有不会触发四舍五入的机制。【下一位没有无法进行四舍五入呀,没办法进1呀】

读完以上的文字 + 图片,你就从感觉上懂了四舍五入,这还不够,得深挖一层。

解读%N.Bf:
对于一个浮点数,比如float RENT = 38522.99;
RENT 的整数位有5位,小数点有1个,小数有2位。
是否四舍五入看:
我这个程序里面,比如我这里是float RENT = 38522.99;
它要保留几位小数,假设是保留%N.Bf中的B位小数,就得看下一位是否比5大,如果是就进1,否则就舍掉。

再看保留的小数位数不够补0的问题:
代码如下:

#include <stdio.h>
int main() 
{ 
	double w=123.1236;
	printf("123456789"); // 空格个数参考
	printf("%9.3f\n",w);
	printf("%9.4f\n",w);
	printf("%9.5f\n",w);
	printf("%9.6f\n",w);
	return 0;
}
/*
123456789
  123.124
 123.1236
123.12360
123.123600
*/

可以看到double w=123.1236小数位是4位,
%N.Bf中的B是5的时候,即保留5位小数,5-4=1,这缺少的一位小数用0填补,即123.12360;
%N.Bf中的B是6的时候,即保留6位小数,6-4=2,这缺少的两位小数用00填补,即123.123600;

可以看到,输出结果左边还有空格导致它们没有对齐输出。这个问题见下一小节,咱一点一点的捋顺问题。

到这里,%N.Bf中只有B用到了,它不仅决定了保留几位小数且会触发四舍五入的机制,还决定了保留的位数不够用0来凑。

%N.Bf中的N有什么用呢?
为了不混淆,N的用处见下一小节。

2. 左右对齐

2.1 什么是左右对齐

先给结论,N的作用是触发右对齐的机制。

看例子来感觉一下,就不讲文字了,否则很枯燥。
在这里插入图片描述
上面例子的代码:

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

浮点数定义的是float a = 3.123456789;
你看到了 %N.Bf%9.3f ,是不是立马能反应过来要保留B位小数,即保留3位小数,看第四位是4 < 5,舍掉,所以输出3.123
这个逻辑大家都懂。
但是为啥3.123前面还有4个空格?【比较123456789,3.123中的3跟5对齐,说明在3的左边有4个空格】
这就用到了 %N.Bf 中的 N。
怎么用的呢?

/*
对于%N.Bf,具体化即 %9.3f,小数是 3.123456789
N表示总位数,这个总位数是这样的:
总位数N = 整数位数 + 小数点 + 小数位数
整数位数 = 总位数N - 小数点 - 小数位数

在这里,总位数N是9,
小数点是1个,
小数位数是3位,
那么 整数位数 = 总位数N - 小数点 - 小数位数
即 9 - 1 -3 = 5
整数位是5是啥意思呢?
表示至少有5个整数,
我们知道了 3.123456789 中的3 已经是1个整数了对吧?
此时 5个整数 - 1个整数 = 4个整数

那这缺少的4个整数怎么表示呢?
你已经猜到了,就是在3.123456789 中 整数3的左边补4个空格,这样就凑够了5个整数位数。

到这里大家都懂吧?  
*/

既然是左右对齐,上面的例子就是右对齐。

展示左右对齐的简单例子:
【右对齐就是你在博客打字,按空格,光标/鼠标往右边跑】【所以,右对齐,左边补空格,是正确的】
【左对齐就是你在博客删字,光标/鼠标往左边跑】
在这里插入图片描述

这下大家应该能懂四舍五入了吧?
有时候四舍五入还会跟左右对齐一起混合使用,我也列出来了。
到这里,对 %N.Bf 你应该知道它无非就是触发四舍五入和触发右对齐的机制嘛。

有问题在评论区中留言,我会反馈的。
给优秀上进的你点赞~
最后,在学习的时候,有些东西必须上机实践,尤其是编程,为什么?因为别人说的不一定是正确的【包括我自己】,
最好的验证方式是让代码的执行结果说话,这是可靠的。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码写注释

请赞赏我

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

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

打赏作者

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

抵扣说明:

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

余额充值