C语言中浮点型分为单精度浮点型 float、双精度浮点型double和long double。其中long double是C99标准新增加的。
不同平台、编译器可能会有些差异,这里以win10 x64为例
- float:占用4个字节(Byte),即32个二进制位(Bit)
- double:占用8个字节(Byte),即64个二进制位(Bit)
- long double:占用16个字节(Byte),即128个二进制位(Bit)
一般来说:long double >= double >= float
另外可引入头文件float.h来打印输出浮点型的最大取值及最小取值范围
具体演示可以看下面的代码片段
单精度float
#include <stdio.h> //预处理语句,引入标准输入输出头文件
#include <float.h> //浮点型头文件
/*时间:2022/3/29作者:sgbl888功能:浮点型float的相关知识知识点:1、float为单精度浮点型,有效精度为6~7位(含整数部分),后面就不能保证正确了2、float占用4个字节,可用sizeof关键字测量一下3、float类型不能加signed或unsigned表示有符号或无符号4、把一个整型转换为float类型5、只输出部分小数位
*/
int main(){//测试把浮点型数值赋值给整型,实际场景这样使用会导致数据错误int f1 = 1.234567; //1int f2 = 0.000001; //0int f3 = 365.12345; //365printf("f1 = %d\t f2 = %d\t f3 = %d\n", f1, f2, f3); //结果只保留了整数部分printf("-----------------\n");//定义float类型数据float f4 = 1.234567;float f5 = 0.0000001; //整体已经超出7位了,因此不能正确显示float f6 = 365.12345; //输出已经超出7位了,因此只能显示365.123444(第8位的5就不正确了)printf("f4=%f \tf5=%f \tf6=%f \n", f4, f5, f6);printf("-----------------\n");//sizeof关键字测量float的占用字节printf("float type use %hd Byte\n", sizeof(float)); //结果为4(即64Bit位)//引入头文件float.h,打印输出float类型最大值和最小值printf("float max: %f\t float min: %f\n", FLT_MAX, FLT_MIN); //340282346638528860000000000000000000000.000000 ~ 0.000000float f7 =340282346638528860990000000000000000099.02; //只能显示整数前面的部分printf("f7 = %f\n", f7);printf("-----------------\n");//把一个整型转换为float类型float f8 = (float) f1;printf("f8 = %f\n", f8); //结果1.000000 为什么呢?因为f1是 int,把1转换就得到这个结果printf("-----------------\n");//输出部分小数位printf("f4 = %.2f\n", f4); //只保留2位小数,结果为1.23return 0; //返回给操作系统内核,0表示正常退出
}
双精度double:
#include <stdio.h>
#include <float.h> //浮点型头文件
/*时间:2022/3/29作者:sgbl888功能:学习double类型的相关知识知识点:1、双精度浮点型double2、比double更大还有long double(C99标准新增)3、double、long double的最大、最小取值范围*/
int main(){//sizeof关键字测试double占用字节printf("double type use %hd Byte\n", sizeof(double)); //占用8个字节,也就64位二进制位printf("long double type use %hd Byte\n", sizeof(long double));//double、long double的最大、最小取值范围printf("double max:%lf double min:%lf\n", DBL_MAX, DBL_MIN);printf("long double max:%Le long double min:%Le\n", LDBL_MAX, LDBL_MIN);printf("--------------\n");//定义double变量double d1 = 12345.987654321012345678908888;printf("d1 = %.16lf\n", d1); //printf默认只输出6位小数。return 0;
}