深入理解C++浮点数(float、double)类型数据比较、相等判断
深入理解C++浮点数(float、double)类型数据比较、相等判断
浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。
1. 将字符串转换为float、double过程存在精度损失,只是float、double各自损失的精度不相同而已。
std::string str="8.2";
float cc=atof(str.c_str()); //cc的值为8.1999998
std::string str="8.2";
double cc=atof(str.c_str()); //cc的值为8.1999999999999993
2. 将float、double转换为字符过程中可能存在精度损失,但是通过%.8lf可以规避
2.1 float小数点前后加起来有效数字只有6位。当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失。
//精度没有丢失
char buf[100]={'\0'};
float aa=8000.25;
sprintf(buf,"%f",aa); //8000.250000
//精度没有丢失
char buf[100]={'\0'};
floataa=8.00025;
sprintf(buf,"%f",aa); buf = 8.000250
//精度丢失,存在误差
charbuf[100]={'\0'};
float aa=8000.251;
sprintf(buf,"%f",aa); //8000.250977
//精度丢失,存在误差此时使用.8lf也无效
char buf[100]={'\0'};
float aa=8000.251;
sprintf(buf,"%.8lf",aa);//8000.25097656
2.2 double小数前后加起来的有效数字只有16位,当给定的double有效数在16位以内转换为字符串不会丢失精度,当有效位数大于16位就会存在精度丢失。
存在误差
char buf[100]={'\0'};
double aa=121.437565871234012;
sprintf(buf,"%.20lf",aa);//121.43756587123401000000
//没有误差
char buf[100]={'\0'};
double aa=8000.256165;
sprintf(buf,"%.8lf",aa);
std::cout<<buf<<std::endl; //8000.25616500
3. 浮点数比较
用"=="来比较两个double应该相等的类型,返回真值完全是不确定的。计算机对浮点数的进行计算的原理是只保证必要精度内正确即可。
我们在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,float和double各有不同。
所以:
const float EPSINON = 0.00001;
if((x >= - EPSINON) && (x <= EPSINON) // 这样判断是可取的,至于为什么取0.00001可按实际情况定义
也可以
abs(x) <= EPSINON
比如要判断浮点数float A和B是否相等,我们先令:
float x = A - B ;
并设
constfloat EPSINON = 0.00001;
则
if ((x >= - EPSINON)&& (x <= EPSINON);//或者if(abs(x) <= EPSINON)
cout<<”A 与B相等<<endl;
else
cout<<”不相等”<<endl;
根据上面分析建议在系统开发过程中设计到字符转换建议采用double类型,精度设置为%.8lf即可,在比较浮点数十建议EPSINON= 0.00000001。
深入理解C++浮点数(float、double)类型数据比较、相等判断相关推荐
- 转载——C语言中float,double类型,在内存中的结构(存储方式)
最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...
- java double 类型_关于Java中的double类型数据
在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...
- Java学习之double类型数据比较
Java学习之double类型数据比较 对于两个double类型的数据,是不能直接用==来比较是否相等 double a=1.01; double b=1.01; if(b==a){System.ou ...
- c语言中数据精度发生错误,C语言Double类型数据保证精度有关问题
C语言Double类型数据保证精度问题 我用手算算出的数据为-1.35323517,但是在C语言里面为了保证数据精度,VC++运行的结果为-1.35323517024517 ,按说应该在-1.3532 ...
- 7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!
一:题目 设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元.现要用这些面值的硬币来购物.在购物中希望使用最少个数硬币.例如,1 次购物需要付款0.55 元,如果 ...
- VS Code写C语言输出long double类型数据不正确的问题
VS Code写C语言输出long double类型数据不正确的问题 在学习<C Primer Plus>一书时遇到一个例题 #include <stdio.h>int mai ...
- java 格式化 浮点数_DecimalFormat的用法 Java 浮点数 Float Double 小数 格式化 保留小数位后几位等...
DecimalFormat的用法 Java 浮点数 Float Double 小数 格式化 保留小数位后几位等 DecimalFormat df = new DecimalFormat(); dou ...
- android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...
前言 项目中用到全国的加油站数据加载 并根据经纬度算出距离 然后根据距离从小到大排序 主要是数据类型是Double 这里必须对数据进行封装 实现也不难 这里讲一下自己的实现方法和实现思路 效果图 先来 ...
- mysql的double类型数据_mysql数据类型double和decimal区别详解
实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 DEClMAL 存储比 BIGINT还大的整数. MySQL 既支持精确类型,也支持不精确类型. FLOAT 和 DOUBLE ...
最新文章
- MySQL 的 count(*) 的优化,获取千万级数据表的总行数
- html创建scrpts方法,HTML5 Canvas口香糖/粘稠球/软面团
- 八十七、探究最短路问题:Dijkstra算法
- 利用 PGO 提升 .NET 程序性能
- python selenium 点击开始按钮_使用Selenium和Python单击一个按钮
- IJCAI 2018:中科院计算所:增强对话生成一致性的序列到序列模型
- 开启防火墙并添加出入站规则
- 本周三、四两场直播丨云时代的数据管理;PG与openGauss的分区特性
- winrar 去广告_解压缩工具之WinRAR下载安装教程
- ARToolKit从图片生成特征点数据
- 【微信小程序】组件间通信与事件-获取子组件的实例对象
- HDU1846 Brave Game【巴什博弈】
- 程序设计比赛WBS图
- 为你的网站添加一个帅气的IP签名档吧 – 教程附源码
- flappy bird用java实现_java实现Flappy Bird游戏源代码
- Autosar NM
- zzzfun、age、omofun常见动漫下载问题汇总
- 移动应用性能测试简介
- Ansys-静力学分析-薄壁圆筒学习心得
- 2021-04-03 java学习