#include<stdio.h>
int main()
{
float f = 0.1;
double d = 0.1;
printf("%lu %lu %lu %lu\n", sizeof(f), sizeof(0.1f), sizeof(0.1), sizeof(d));
return 0;
}
输出
$ ./a.out
4 4 8 8
根据上述代码,我们可以看到
sizeof(0.1)
和sizeof(0.1f)
不同。其中sizeof(0.1)为8个字节
,而sizeof(0.1f)为4个字节
。但是在将值赋给浮点变量f时,它会自动截断其大小为4个字节
。在下面的代码中,与浮点数x进行比较时,它不会截断,并且将
4个字节的float
与8个字节的0.1
进行比较,float x
的值与0.1f
相匹配,因为两者都是4个字节
。#include<stdio.h>
int main()
{
float x = 0.1;
if (x == 0.1)
printf("IF");
else if (x == 0.1f)
printf("ELSE IF");
else
printf("ELSE");
}
输出
$ ./a.out
ELSE IF
为什么在赋值时截断,而在比较时不截断?如何解决这个问题?
float
类型是单精度浮点类型,而double
是双精度浮点类型。我还建议您阅读"Is floating-point math broken?",这将帮助您理解为什么0.1f != 0.1
。 - Some programmer dudefloat
类型。 - fuz