零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.float和double简介
不管是 C
或者 C++
开发,在做 float
和 double
相互转换之前,我们首先需要知道 float
和 double
的区别,在文章《float
和 double
的区别》和 《数据类型/变量类型》 中我们有做详细的讲解:
1.float(单精度)
float
整数部分取值范围:能表达式万亿级别,已经够大了,实际开发完全够用;float
小数部分取值范围:最多只能精确到小数点后6
位;
2.double(双精度)
double
整数部分取值范围:比float
更大,脑补就行了…;double
小数部分取值范围:最多只能精确到小数点后15
位;
二.float和double转换
1.常规float和double转换
//double 转 floatdouble a = 3.145;float b = a; //3.145//float 转 doublefloat a = 3.145;double b = a; //3.145//double 转 float double a = 3.145; float b = a; //3.145 //float 转 double float a = 3.145; double b = a; //3.145//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.25097656system("pause");return 0;}/*输出:8000.2500008.0002508000.2509778000.25097656请按任意键继续. . .*//************************************************************************/ //@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 请按任意键继续. . . *//************************************************************************/ //@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.437566printf("%lf\n", dValue);//精度没有丢失,小数点前后累计没有超过16位dValue = 8000.256165;printf("%lf\n", dValue);//8000.256165system("pause");return 0;}输出:121.4375668000.256165请按任意键继续. . ./************************************************************************/ //@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 请按任意键继续. . ./************************************************************************/ //@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
在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,float
和double
各有不同;
比如要判断浮点数 float
变量 A
和 B
是否相等,示例代码如下:
float x = A – B;const float EPSINON = 0.00001;if ((x >= - EPSINON)&& (x <= EPSINON)cout<<”A 与B相等<<endl;elsecout<<”不相等”<<endl;float x = A – B; const float EPSINON = 0.00001; if ((x >= - EPSINON)&& (x <= EPSINON) cout<<”A 与B相等<<endl; else cout<<”不相等”<<endl;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
三.猜你喜欢
- C语言 数组下标越界和内存溢出区别
- C语言 使用指针遍历数组
- C语言 指针和数组区别
- C语言 指针数组和数组指针区别
- C语言 野指针
- C语言 函数值传递和址传递
- C语言 函数不定长参数
- C语言 函数指针
- C语言 指针函数
- C语言 回调函数 callback
- C语言 #pragma once
- C语言 #include <> 与 #include “” 区别
- C语言 const 修饰函数参数
- C语言 const 和 define 区别
- C语言 #运算符
- C语言 ##运算符
- C语言 __VA_ARGS__
- C语言 ##__VA_ARGS__
- C语言 函数不定长参数 ##__VA_ARGS__经典案例
- C语言 va_start / va_end / va_arg 自定义 printf 函数
- C语言 main 函数
- C语言 main 函数参数 main(int argc, char *argv[])
- C语言 局部变量
- C语言 全局变量
- C语言 全局变量和局部变量区别
- C语言 static
- C语言 extern
- C/C++ Unicode 和多字节区别
- C/C++ wprintf 输出中文乱码
- C/C++ char 和 wchar_t 相互转换
ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
- 最新
- 最热
只看作者