float浮点数的四舍五入
前几天,有个小伙伴在做实验过程中,发现了一个奇怪的现象,这个现象就是…
他在用printf输出浮点数的时候,想把数据保留到小数点后的两位,他是这么写的…
float c=1.155;printf(“%.2f”,c);
他的书写是对的,没有错误。但是他发现,当c等于1.555时,保留两位小数输出是1.55,而当c等于3.555时,保留两位小数输出是3.56。这个结果,就让人捉摸不透了,因为…
如果是程序运算会自动四舍五入的话,结果应该是1.56和3.56;如果程序运算不会自动四舍五入的话,结果应该是1.55和3.55。可是结果却是1.55和3.56,这是什么鬼?
如果你去百度输入关键词“浮点数 四舍五入”,你会发现,有些人会说浮点数会自动四舍五入,如下图…

而有些人会说,不会自动四舍五入,如下图…

到底会不会自动四舍五入呢?
我刚才拿老顽童STM32开发板做了一个实验,我定义了6个浮点数,他们分别是…

然后我用printf给他们保留2位小数后输出,程序如下…

在串口调试助手上看到的结果是…

结果是,6个数,有3个数自动四舍五入了,有3个数没有四舍五入。
不管理论是什么,我们只看结果。结果是:浮点数保留小数点后的数据,有时会自动四舍五入,有时不会自动四舍五入。但是…
如果把一个浮点数赋给一个整数变量后,一定不会四舍五入。
所以,我们在保留浮点数的小数点精度时,必须要人工处理四舍五入。
很多人一直在用的一个的方法,就是加0.5法。
这个方法的理论依据是:
float f;//定义了一个浮点数
int t;//定义了一个整数
我们执行(t=f;)这条语句,不管f的小数点后面是小于5的数,还是大于等于5的数,都不会四舍五入,例如当f=3.2和f=3.8,结果都是t=3。
那么怎么样让f=3.8时,t=4呢?我们可以给f+0.5来解决,例如当f=3.8时,f+0.5=4.3,执行完t=f后,t就等于4了。而当f的小数点后的的数都小于5时,加一个0.5不会大于4,所以执行完t=f后,结果还都是3。这正好符合我们四舍五入的要求。
这里需要注意的是:其实这个…
加0.5的方法
只适合用于保留整数位的应用
很多人都不知道这一点,下面我就给大家实践一下。
按照加0.5法的原理,如果要保留2位有效数据的话,需要给数据加0.005,我们做个实验,把temp1~6都加0.005。

然后我们看输出结果,如下图…

看到了正确的结果,你不要高兴,因为…
你现在可以把temp1~6的小数点后面都改为554,如下图…

这时候,正确的结果,小数点后两位应该都是55,但是你看看结果,还是照样是56。这时候,就输出了完全错误的结果。
有的朋友会说,既然加0.005不行,那我们想办法还是加0.5吧。好的,下面我有一个方法…
先把temp1*100,然后再+0.5,然后把这个浮点数赋值给一个整数,然后再把这个整数除以100。
例如temp5的程序写为…
temp5=temp5*100+0.5;
t5=temp5;
temp5=(float)t5/100;
其中,t5是我定义的一个uint32_t类型的整型变量。我们来分析一下,因为temp5=4.555,4.555乘以100以后是455.50,然后再加0.5以后是456.00,把456.00取整后是456,然后456除以100就是4.56。
一切都算计的很好,但是实际的结果却还是4.55。但是如果你这样写的话,结果就是正确的…
temp5=4.555*100+0.5;
t5=temp5;
temp5=(float)t5/100;
看这个程序和上边的程序对比一下,只是这里直接用了4.555,而上边的程序用了temp5,看似一样,结果却不一样。上边程序的结果是4.55,下边程序的结果是4.56。
上边两个加0.5的实践,你一定要试一下。
那保留2位小数,怎么做才能确保完全正确?
送给大家一句话:捷径有可能是歧途,最笨的办法,其实是最保险的办法。(顽童哥语录一定要收藏)
我们可以把小数点后的第三位数取出来,然后判断它和5的大小,然后四舍五入。就是这个方法,绝对正确。写成程序的话,是这个样子的…

其中,t1是定义的uint32_t类型的整型变量。我们把数据带进去看一下,temp1是0.555,0.555乘以1000是555,555除以100取余数是55,55再除以10取余数是5,那t1就等于5。下面用if语句判断是否要进位,如果需要进位的话,4.555乘以100就是455.5,455.5加1就是456.5,然后我们把456.5强制类型转换成整型数据,就是456,456除以100,就是4.56;如果不需要进位的情况,大家自行分析。
这时候,你去换temp1~6的值去吧,不管换什么,结果都会四舍五入。
做一个稳定的电子产品,基础知识很重要!
float浮点数的四舍五入的更多相关文章
- Float浮点数的使用和条件
在这里简单的说一下,我对浮点数的理解,可能说的比较浅,老师也没有说,只是略微的提了一下,完全是我自己个人的理解. 我觉得float浮点数的用法和int的用法有些雷同,浮点数用于计算小数点单位,我们先可 ...
- round()函数 浮点数的四舍五入
浮点数的四舍五入 print round(1.7333) 2.0
- Python之☞float浮点数精度问题
Python的浮点数损失精度问题(转) 一个简单的面试题: >>>0.1+0.1+0.1 0.2 >>>0.1+0.1+0.1 0.3000000000000000 ...
- float浮点数的二进制存储方式及转换
int和float都是4字节32位表示形式.为什么float的范围大于int? float精度为6-7位.1.66*10^10的数字结果并不是166 0000 0000 指数越大,误差越大. 这些问题 ...
- float 浮点数与零值0比较大小
float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float x 与“零值”比较的if语句 请写出 float x 与“零值”比较的 if ...
- WinCE的C#编程,对float型进行四舍五入保留两位小数,小数进行四舍五入操作,Math.Round的应用案例。
private float ConvertFloat4Se5Ru(float flotValue) { int iValue = (int)Math.Round(flotV ...
- Python中4位1进制数与float浮点数互相转换
import struct s = 'F4CEF042' print(s) #<是小端,>是大端,f代表浮点数 print(struct.unpack('<f', bytes.fro ...
- float 浮点数与零值0比较大小 ZZ
float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float x 与“零值”比较的if语句 请写出 float x 与“零值”比较的 if ...
- 实现浮点数的四舍五入RoundOff,保留几位小数
直接上代码,非常简短 double myRound(double d,int n) { d = d*pow(10,n); d += 0.5; d = (long)d; d = d/pow(10,n); ...
随机推荐
- PowerShell 中使用 mvn 编译报错 Unknown lifecycle phase ".test.skip=true". 解决办法
nknown lifecycle phase “–Dmaven.test.skip=true”. You must specify a valid lifecycle phase or a goal ...
- CSS html标签元素分类
在CSS中,html中的标签元素大体被分为三种不同的类型: 块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1>… ...
- 016.Zabbix聚合监控
一 Zabbix监控机汇总计算 用Calcuated Items可以对Items进行汇总计算,如求磁盘总容量.网络流量,只依赖于Zabbix-Server,与Zabbix-Agent和proxy无关. ...
- python 函数式编程学习笔记
函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...
- Java NIO -2
NIO http://www.cnblogs.com/puyangsky/p/5840873.html -- 操作系统与 Java 基于流的 I/O模型有些不匹配.操作系统要移动的是大块数据(缓冲区) ...
- IP基础知识与分配实现
一.IP寻址 1.划分网络ID和主机ID的最初方案是使用地址分类. 2.A类:0.0.0.0-127.255.255.255 B类:128.0.0.0-191.255.255.255 C类:192.0 ...
- Codeforces Round #272 (Div. 2) A. Dreamoon and Stairs 水题
A. Dreamoon and Stairs 题目连接: http://www.codeforces.com/contest/476/problem/A Description Dreamoon wa ...
- CentOS添加环境变量的三种方式
CentOS添加环境变量的三种方式,以添加php环境变量为例,假定php的安装目录为 /usr/local/php5 一.仅对当前会话临时生效 [root@bogon ~]# export PATH= ...
- STM32F4 External interrupts
STM32F4 External interrupts Each STM32F4 device has 23 external interrupt or event sources. They are ...
- MDK5 and STM32Cube
D:\Workspace\........\RTE\Device>STM32CubeMX.exe -s project.script -tpl_path C:\Keil5\ARM\Pack\Ke ...