类似于1.234567,0.00001,这类非整数的数据。int能不能装这些数据?
#include <stdio.h>
int main() {
int a = 1.234567;
int b = 0.00001;
int c = 365.12345;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
小数部分都丢失了,这时候就需要引入新的类型了——浮点类型。
把代码中的整型 int
,用单精度浮点型 float
替代。之后,再将 printf("%d\n",a)
; 中的占位符是 %d
,所以我们用 %f
替换。( %d
占位符用于整型, %f
占位符用于浮点型)
#include <stdio.h>
int main() {
float a = 1.234567;
float b = 0.00001;
float c = 365.12345;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
将 int 替换成 float 之后,大部分的数据都是正确的。但是 365.12345 变成了 365.123444 ,很明显精度出现了误差。 这是因为,浮点数并不能表示无限的精确,它会存在着一定的误差。
C标准规定,float类型必须至少能表示6位有效数字,并且取值范围至少是10^-37~10+37。
所以,使用float
来装365.12345
时,前面六位数值是准确的,但是后面的数值略有误差。
double
叫做双精度浮点型,是比float
精度更高的类型。把上面代码中的 float
换成 double
。
printf
函数 中使用的占位符不需要修改,float
和double
均可以使用 %f
来作为占位符。
#include <stdio.h>
int main() {
double a = 1.234567;
double b = 0.00001;
double c = 365.12345;
printf("%f\n", a);
printf("%f\n", b);
printf("%f\n", c);
return 0;
}
这次 365.12345 也是正确的了。
注意: double 类型也是有精度范围的。如果是更高精度的数据, double 也会出现误差。
日常的应用中,不会苛求一个精度完美的数值,是会允许存在一定误差范围的。但是,如果涉及高精度领域的计算时,需要额外使用特殊的方法进行数值计算,以尽量减少误差。
之前对整型的经验,越大范围的整型类型所占的空间越大。 那么对于浮点类型来说,越高精度、越大范围的浮点类型,应该也会占用越大的空间。
用sizeof
来测量一下float
和double
分别占用多大的空间。
#include <stdio.h>
int main() {
printf("sizeof float = %d\n", sizeof(float));
printf("sizeof double = %d\n", sizeof(double));
return 0;
}
float , double 分别为4,8个字节。证明:对于越大范围,越高精度的类型所占空间越大。