例:{
float a=2.4;
if(a==2.4) printf("OK\n");
else printf("ERROR\n");
}
按说这个程序应该输出OK的,但不知道为什么输出的却是ERROE,用if(a>=2.4&&a<=2.4)也不行,除非用if(a==2.4f),但其他的类型比如double就不用这样,谁能给咱详细讲一下,小弟实在是很迷茫?
因为2.4无法的小数部分0.4=2/5,只有在5进制或5的倍数进制(如10进制)里,0.4才能精确地表示出来.然而计算机的float是存储二进制"尾数"的,因此只能找一个特别接近0.4的二进制小数表示它(实际情况还要复杂一些)总之,二进制表示0.1,0.2,0.3,0.4都不准确,0.5,0.25,0.75,0.125等则反而是准确的,就这么奇怪.
#include<stdio.h>
typedef unsigned char usc;
prt(usc ch,int b)
{
if(b)prt((usc)(ch/2),b-1);
printf("%d",ch%2);
}
main()
{ int i;
union {
float f;
usc a[4];
} x;
x.f = 2.4f;
printf("2.4f的编码(从高位到低位)是\n");
for(i=3;i>=0;i--)
{prt(x.a[i],7);printf(" ");}
printf("\n");
}