我正在研究一些'确定输出' C中的问题。我遇到了这个看起来很简单的问题,但在运行代码后让我感到困惑。
我预期的输出是" True"。但是在跑步时,它是错误的"。当我使用printf()检查f的值时,它显示为0.1。有人可以解释一下为什么f被赋予0.1并不能为IF语句返回true吗?
从我选择问题的地方找不到答案,我自己也找不到答案。
#include <stdio.h>
int main()
{
float f = 0.1;
if (f == 0.1)
printf("True");
else
printf("False");
}
答案 0 :(得分:9)
问题是变量f
定义为类型为float
而浮点常量0.1
的类型为double
。类型double
的精度高于float
类型的精度。它有更多的二进制数字来表示分数。所以在这个声明中
float f = 0.1;
有一个截断。
要获得预期的结果,您至少应该写
if (f == 0.1f)
另外,为了确保没有舍入,代码应该看起来像
#include <stdio.h>
int main( void )
{
float f = 0.1f;
if ( f == 0.1f )
printf("True\n");
else
printf("False\n");
}
答案 1 :(得分:2)
这是因为浮动值的精确度。
选中此项: - What Every Computer Scientist Should Know About Floating-Point Arithmetic
你最好使用double而不是float。
另外要注意( WhozCraig正确指出),0.1是双倍而不是浮点数。将float
更改为double
,您将获得预期的输出。
答案 2 :(得分:1)
0.1
无法用二进制表示。二进制文件中的0.1
将是0.0r0011r
,它会在内部重复出现,它会四舍五入,这不是确切的值。这就是它返回false的原因。但是,如果您尝试使用数字为0.5,即二进制0.1
或0.250或0.125中的任何一个可以完美表示,它将返回true。另请阅读http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。最好使用double
来获得更准确的结果。
答案 3 :(得分:1)
嗯,浮动类型有问题。检查如果使用double类型更改float,则会输出true而不是false。也尝试这个输出:
#include <stdio.h>
int main()
{
float f;
for(f=.0;f<10.;f+=0.1)
printf("%f \n",f);
}