1.处理小数
我们先前学过了整型数据类型 可以思考一下可不可以用整形数据类型储存小数
int main(){
// 我们已经学完了整型数据类型 那么如果要用其来处理小数的话 那么合适吗 我们可以编写代码测试一下
int a = 1.1;
int b = 2.2;
printf("%d\n", a);// 1
printf("%d\n", b);// 2
return 0;
}
我们从结果中可以看到 如果用整型储存小数的话 那么将会丢失小数部分
所以我们引入了浮点类型 首先用float单精度浮点型储存一下试试
int main(){
float a = 1.1;
float b = 365.12345;
printf("%f\n", a);// 1.1
printf("%f\n", b);// 365.123444
return 0;
}
从结果可以看出 a这个小数被正确表示了 但是b的小数值正确表示了6位有效数字 其余位均为被正确表示
其实这个可以解释 C标准中规定 float类型至少能够表示6位有效数字 因此他正确表示了前7位 至于其余位是否被正确表示不在他的考虑范围之内
接着我们用double双精度浮点型储存一下(double的精度比float高)
但是既然改变了储存类型 那么占位符是否需要改变呢 也就是%f是否需要改变呢 答案是不需要 这个之后会讲到 即float和double都可以用%f作为占位符
int main(){
double a = 1.1;
double b = 365.12345;
printf("%f\n", a);// 1.1
printf("%f\n", b);// 365.123450
return 0;
}
从结果可以看出 刚才float未能正确表示的365.12345 如果改用double储存的话 那么将可以被正确显示
但是虽然double类型的精度比float类型的精度要高 但是如果想要用double类型表示更高精度的数据的话 那么也难免会出现误差
如果涉及到高精度的计算领域的话 那么需要额外使用其他的方法来解决 避免误差的产生
2.浮点数占用的字节大小
之前我们在讨论整型数据类型的字节大小时 有这样一个规律就是:
数据范围越大的类型 他所占用的字节大小就越大
这个规律同样适用于浮点数:
精度越高、数据范围越大的类型 他所占用的字节大小就越大
我们可以用sizeof去测量一下float、double两者的字节大小
int main(){
printf("%zu\n", sizeof(float));// 4
printf("%zu\n", sizeof(double));// 8
return 0;
}
从结果来看 顺带验证了一下我们的结论