为什么下面给出的代码在屏幕上打印b?
#include<stdio.h>
main()
{
float a = 5.6;
if(a == 5.6)
{
printf("a");
}
else
{
printf("b");
}
}
答案 0 :(得分:3)
由于浮点数不能完全匹配(因为您选择的每两个数字之间是无限其他数字)。机器不能代表它们全部,并且被强制用它能够代表的一些浮点数代表它们。
因此,在您的情况下,系统可能不存储5.6
,因为这是您的机器不想表示的数字。相反,它将非常接近5.6
的东西存储到内存中。
因此,如果您与浮点数进行比较,您永远不应该检查等值。相反,您应该使用系统C define FLT_EPSILON
并检查
if (((a - 5.6) > -FLT_EPSILON) && ((a - 5.6) < FLT_EPSILON))
{
...
}
其中FLT_EPSILON
是可表示的最小浮点类型值。
因此,如果从a到5.6的差异绝对小于EPSILON,你可以确定它是相同的,但是机器选择了它知道的下一个数字而不是5.6
。
同样是双重类型的DBL_EPSILON。
此类型在float.h
答案 1 :(得分:2)
如果您想要浮动值,请不要忘记添加f
#include<stdio.h>
main()
{
float a = 5.6f;
if(a == 5.6f)
{
printf("a");
}
else
{
printf("b");
}
}
按预期打印a
。
问题在于5.6
被定义为double
文字,而a
在float
中被转换为if
&#39 ; s仍然将它与double
值进行比较,这样你就会变错。
实际上只在if中添加f
就足够了,但更安全然后抱歉。
答案 2 :(得分:0)
c中的浮点数默认为double。如果要使用float,则需要在数字末尾添加f
。尝试下面的代码a
#include<stdio.h>
main()
{
float a = 5.6;
if(a == 5.6f)
{
printf("a");
}
else
{
printf("b");
}