相同的浮点值比较为不等

我正在研究C中的一些“确定输出”问题。我遇到了这个看起来很简单的问题,但在运行代码后让我感到困惑。

我预期的输出是“真”。 但是在跑步时,它是“假的”。 当我使用printf()检查f的值时,它显示为0.1。 有人可以解释一下为什么f被赋予0.1对于IF语句不会返回true?

从我选择问题的地方找不到答案,我自己也找不到答案。

#include  int main() { float f = 0.1; if (f == 0.1) printf("True"); else printf("False"); } 

问题是变量f定义为具有float类型,而float常量0.1定义为double类型。 double类型比float类型具有更高的精度。 它有更多的二进制数字来表示分数。 所以在这个声明中

  float f = 0.1; 

有一个截断。

为了得到预期的结果,你至少应该写

  if (f == 0.1f) 

此外,为了确保没有舍入代码应该看起来像

 #include  int main( void ) { float f = 0.1f; if ( f == 0.1f ) printf("True\n"); else printf("False\n"); } 

那是因为浮动值的精确度。

检查一下: – 每个计算机科学家应该知道的浮点运算

你可以更好地使用double而不是float。

还要注意( 由WhozCraig正确指出 )0.1是双倍而不是浮点数。 将float更改为double ,您将获得预期的输出。

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来获得更准确的结果。

好吧,这是浮动类型的问题。 检查如果使用double类型更改float,则会输出true而不是false。 也尝试这个输出:

 #include  int main() { float f; for(f=.0;f<10.;f+=0.1) printf("%f \n",f); }