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

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门


一.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 位就会存在精度丢失

/************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ float 和 double 相互转换
//@Time:2021/08/14 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/************************************************************************/

#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 位存在精度丢失

/************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ float 和 double 相互转换
//@Time:2021/08/14 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/************************************************************************/

#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. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. C语言 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 #运算符
  16. C语言 ##运算符
  17. C语言 __VA_ARGS__
  18. C语言 ##__VA_ARGS__
  19. C语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C语言 va_start / va_end / va_arg 自定义 printf 函数
  21. C语言 main 函数
  22. C语言 main 函数参数 main(int argc, char *argv[])
  23. C语言 局部变量
  24. C语言 全局变量
  25. C语言 全局变量和局部变量区别
  26. C语言 static
  27. C语言 extern
  28. C/C++ Unicode 和多字节区别
  29. C/C++ wprintf 输出中文乱码
  30. C/C++ char 和 wchar_t 相互转换

未经允许不得转载:猿说编程 » C/C++ float 和 double 相互转换
喜欢(0) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏