0
点赞
收藏
分享

微信扫一扫

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


清晰的笔记代表清晰的头脑。

之前写这篇文章,以为自己把这个话题说明白了,看评论区反馈,

按照费曼学习法,我没把这个东西说明白,反而是我自己没搞懂,

那么再优化一下,采用具体的场景


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

  • ​​1. 四舍五入​​
  • ​​1.0. c语言在线编辑工具​​
  • ​​1.1 什么是四舍五入?​​
  • ​​2. 左右对齐​​
  • ​​2.1 什么是左右对齐​​

1. 四舍五入

1.0. c语言在线编辑工具

​​在线编译c语言工具​​

可以快速调试文章当中的C语言代码。

快速收到正确或错误的反馈。

1.1 什么是四舍五入?

结合数学知识,来看下面的数学问题:

什么是四舍五入?看下面的例子你就回忆起来了。

看例子来感觉一下,就不讲文字了,否则很枯燥。

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

我们来看这样的代码,是评论区伙伴摘自 c primer plus第六版中文版73页的例子。

代码及运行结果:

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

3522.99 —> 38523.0,

​%3.1f​​告诉你,保留1位小数,看第二位是否比5大?如果是,就进1,所以就是3522.99 —> 38523.0。

这个逻辑大家都懂。

好,我要变身了

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

3522.99 —> 3522.99

​%3.2f​​保留2位小数,因为只有2位小数,所有不会触发四舍五入的机制。【下一位没有无法进行四舍五入呀,没办法进1呀】

这个逻辑大家都懂。

再来看:

C语言四舍五入的原理分析_浮点数_03

3522.99 —> 38523.0

​%4.1f​​,你应该明白了,

保留1位小数,看第二位是否比5大?如果是,就进1,所以就是3522.99 —> 38523.0。

再来看:

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

​%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的作用是触发右对齐的机制。

看例子来感觉一下,就不讲文字了,否则很枯燥。

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

上面例子的代码:

#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个整数位数。

到这里大家都懂吧?
*/

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

展示左右对齐的简单例子:

【右对齐就是你在博客打字,按空格,光标/鼠标往右边跑】【所以,右对齐,左边补空格,是正确的】

【左对齐就是你在博客删字,光标/鼠标往左边跑】

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

这下大家应该能懂四舍五入了吧?

有时候四舍五入还会跟左右对齐一起混合使用,我也列出来了。

到这里,对 ​​%N.Bf​​ 你应该知道它无非就是触发四舍五入和触发右对齐的机制嘛。


举报

相关推荐

0 条评论