我有一个简单的C片段如下:
#include<stdio.h>
#include<conio.h>
int main()
{
float a=0.3,b=0.5
clrscr();
if(a==0.3)
{
printf("equal");
}
else
{
printf("unequal");
}
if(b==0.5)
{
printf("equal");
}
else
{
printf("unequal");
}
getch();
}
将输出显示为:unequal equal
。
我理解这一点,因为计算机将0.3
视为1/3
而0.333...
不等于0.33
,它显示的输出不相等,而0.5
则显示精确数字,因此它输出为equal
。
但是现在如果我像这样float b=0.2
:
float b=0.2;
if(b==0.2)
{
printf("equal");
}
else
{
printf("unequal");
}
然后它还显示unequal
作为输出!由于0.2
为1/5
- 精确值,因此应输出equal
。
有谁能告诉我这里有什么问题吗?
答案 0 :(得分:2)
稍微简化一点,浮点数基本上存储为2的幂的一系列分数。(1 / 2,1 / 4,1 / 8,1 / 16,1 / 32,1 / 64等)。如果您的数字可以表示为某些数字的总和,那么您很幸运 - 对于大多数数字(1 / 3,1 / 5等),您会得到非常接近的近似值。比较完全相等的浮点数是充满危险的。