相同的浮点值比较为不等
我正在研究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); }