C/C++ float和double相互转换

最后更新于:2020-07-02 22:52:03

一.float和double简介

不管是C或者C++开发,在做floatdouble相互转换之前,我们首先需要知道floatdouble的区别,在文章floatdouble的区别和文章 数据类型/变量类型 中我们有做详细的讲解:

1.float(单精度)

float 整数部分取值范围:能表达式万亿级别,已经够大了,实际开发完全够用;float 小数部分取值范围:最多只能精确到小数点后6位;

2.double(双精度)

double 整数部分取值范围:比float更大,脑补就行了…;double 小数部分取值范围:最多只能精确到小数点后15位;

二.float和double转换

1.常规float和double转换

//double 转 float
double a = 3.145;
float b = a; //3.145 

//float 转 double
float a = 3.145;
double b = a; //3.145 

2.注意float和double精度丢失

float小数点前后加起来有效数字只有6位,当给定的float有效数在6位以内转换为字符不会丢失精度,当有效位数大于6位就会存在精度丢失

/************************************************************************/
/*@文件名      : float_double.cpp
/*@日  期      : 2020/06/21 19:37
/*@作  者      : 猿说编程
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : float/double精度丢失问题 - C/C++教程
/************************************************************************/



#include "stdafx.h"
#include <stdio.h>
#include "windows.h"

#pragma warning( disable : 4996)

int _tmain(int argc, _TCHAR* argv[])
{

    //精度没有丢失,小数点前后累计没有超过六位
    float fValue = 8000.25;
    printf("%f\n", fValue);

    //精度没有丢失,小数点前后累计没有超过六位
    fValue = 8.00025;
    printf("%f\n", fValue);

    //精度丢失,存在误差,小数点前后累计超过六位
    fValue = 8000.251;
    printf("%f\n", fValue);////8000.250977

    //精度丢失,小数点前后累计超过六位,存在误差此时使用.8lf也无效
    fValue = 8000.251;
    printf("%.8lf\n", fValue);//8000.25097656


    system("pause");

    return 0;
}

输出:
8000.250000
8.000250
8000.250977
8000.25097656
请按任意键继续. . .


double小数前后加起来的有效数字只有16位,当给定的double有效数在16位以内转换为字符串不会丢失精度,当有效位数大于16位存在精度丢失

/************************************************************************/
/*@文件名      : float_double.cpp
/*@日  期      : 2020/06/21 19:37
/*@作  者      : 猿说编程
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : float/double精度丢失问题 - C/C++教程
/************************************************************************/

#include "stdafx.h"
#include <stdio.h>
#include "windows.h"

#pragma warning( disable : 4996)

int _tmain(int argc, _TCHAR* argv[])
{

    //精度丢失,存在误差,小数点前后累计超过16位
    double dValue = 121.437565871234012;//121.437566
    printf("%lf\n", dValue);

    //精度没有丢失,小数点前后累计没有超过16位
    dValue = 8000.256165;
    printf("%lf\n", dValue);//8000.256165

    system("pause");

    return 0;
}

输出:
121.437566
8000.256165
请按任意键继续. . .

3.判断浮点数相等

用”==”来比较两个double应该相等的类型,返回真值完全是不确定的。计算机对浮点数的进行计算的原理是只保证必要精度内正确即可。

我们在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,floatdouble各有不同;

比如要判断浮点数float变量AB是否相等,示例代码如下:

float  x = A – B;
const float EPSINON = 0.00001;

if ((x >= - EPSINON)&& (x <= EPSINON)
    cout<<”A 与B相等<<endl;
else
    cout<<”不相等”<<endl;

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


猜你喜欢

1. 三目运算符

2. 逗号表达式

3. float与double区别

4. int和double相互转换

5. unicode和多字节区别




转载请注明: 猿说编程 » C/C++教程 » float和double相互转换



技术交流、商务合作请直接联系博主
扫码或搜索:猿说编程

python/C++教程

猿说编程
微信公众号 扫一扫关注