浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是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可以规避
   (1)float小数点前后加起来有效数字只有6位。当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失

//精度没有丢失
    char buf[100]={'\0'};
    float aa=8000.25;
    sprintf(buf,"%f",aa);   //8000.250000

//精度没有丢失
    char buf[100]={'\0'};
    float aa=8.00025;
    sprintf(buf,"%f",aa);   buf = 8.000250

//精度丢失,存在误差
    char buf[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)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,可以自己按实际情况定义

根据上面分析建议在系统开发过程中设计到字符转换建议采用double类型,精度设置为%.8lf即可,在比较浮点数十建议EPSINON = 0.00000001

c++ double float 数值比较的更多相关文章

  1. impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)

    impala 四舍五入后转换成string后又变成一个double的数值解决(除不尽的情况)例如Query: select cast(round(2 / 3, 4)*100 as string)+-- ...

  2. mysql基础之double,float长度标度定义

    MySQL类型float double decimal的区别 float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decima ...

  3. Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案

    一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...

  4. iOS - Json解析精度丢失处理(NSString, Double, Float)

    开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:经过测试其实系统NS ...

  5. java中浮点数的比较(double, float)(转)

    问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...

  6. double float的精度问题

    三部曲 1: #include <iostream> #include <stdio.h> #include <string.h> using namespace ...

  7. impala支持的数据库里的double(float)类型,通过迁移inceptor后,类型的值都变成了null

    impala支持的数据库里的double(float)类型,通过迁移inceptor后,double类型的值都变成了null. 通过查阅日志发现默认将double转换成Decimal(38,10)然而 ...

  8. C# double float int string 与 byte数组 相互转化

    在做通信编程的时候,数据发送多采用串行发送方法,实际处理的时候多是以字节为单位进行处理的.在C/C++中 多字节变量与Byte进行转化时候比较方便 采用UNION即可废话少说看示例:typedef u ...

  9. C#中decimal ,double,float的区别

    浮点型 Name CTS Type Description Significant Figures Range (approximate) float System.Single 32-bit sin ...

随机推荐

  1. HDU 1260 Tickets (动规)

    Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  2. 解决:IIS APPPOOL\DefaultAppPool 登录失败的问题

    为大家介绍下解决IIS APPPOOL\DefaultAppPool 登录失败的方法,有遇到类似问题的朋友参考下. 添加ASP.NET网站时,选择添加"添加应用程序"连接sql s ...

  3. 批处理学习笔记2 - 编写批处理的for循环

    批处理中的for循环集成的功能比较多,可以直接对文件操作. ====================================================================== ...

  4. 【Android】11.5 创建和管理Fragments

    分类:C#.Android.VS2015: 创建日期:2016-02-22 一.简介 想要管理activity中的fragment,可以用FragmentManager类来实现.通过在activity ...

  5. 向linux服务器上传下载文件方式收集

    向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...

  6. c++全局函数 && 成员函数

    #include<iostream> using namespace std; class Test { public: Test(, ) { this->a = a; this-& ...

  7. 一款基于jquery ui的动画提交表单

    今天要给大家分享一款基于jquery ui的动画提交表单.这款提交表单的的效果是以动画的形式依次列表所需填写的信息.效果非常不错,效果图如下: 在线预览   源码下载 实现的代码. html代码: & ...

  8. 广度优先遍历目录(Windows平台、C++)

    深度优先的遍历网上一大把,就是递归调用,这里就不说了,说点网上找不到的. #include <Windows.h> #include <stdint.h> #include & ...

  9. Jackson2.1.4 序列化对象时对属性的过滤

    //对field(所有字段)进行过滤 //对get方法进行过滤 //对isBoolean这样的方法进行过滤 //里面的具体配置有 ANY,DEFAULT,NON_PRIVATE,NONE,PROTEC ...

  10. 7-zip 压缩算法及C SDK使用

    pdf版本下载:http://files.cnblogs.com/davad/7-zip_and_SDK.pdf 1. 介绍 官方网址:中文:http://sparanoid.com/lab/7z/ ...