C语言中使用实变量时的关系运算符

C语言中使用实变量时的关系运算符,c,floating-point,relational,C,Floating Point,Relational,为什么产出不如预期 #include <stdio.h> void main(){ float a,b,c; b=0.7; if( b<0.7 ) printf(" It should NOT be here"); else printf("It Should be here"); } 浮点数 精确度有限 有些价值不存在。0.7就是这样的值。在我的平台上是 0.699999988. 原因:我们写的数字是十进制的

为什么产出不如预期

#include <stdio.h>
void main(){
    float a,b,c;
    b=0.7;
    if( b<0.7 )
        printf(" It should NOT be here");
    else
        printf("It Should be here");
}
浮点数

精确度有限 有些价值不存在。0.7就是这样的值。在我的平台上是 0.699999988. 原因:我们写的数字是十进制的,但内部数字是二进制的。存在许多更长的材料
所以你会感到惊讶,0.7是双倍值。在代码中尝试0.7f。它应该可以工作。

请尝试下面的代码,它可以工作!!!:

代码


请正确格式化您的代码,并给出预期的输出,以及您得到的输出。不,您似乎不了解浮点行为。是0.69999999996或0.69999988取决于声明B是浮点;0.7是双精度类型的值。两者之间的比较需要进行转换。编译器将浮点值转换为双精度值。。。将浮点转换为double得到的值与编译器将源代码中的文本字符串转换为double得到的值不同。但是永远不要将浮点值float、double或long double与==进行比较。@JacekCz-我用0.7f尝试了这段代码,它很有效。请自己试一试。它应该可以工作。@RudyVelthuis,但类型应该相同。Float应该与Float进行比较。@Jaczek:如果转换正确,b中的值应该等于0.7f:b=0.7f;如果b<0.7f,你试过了吗?可能不行,它行得通!!我已经跑过了吗?在哪个平台上?更改初始化的分配不会改变任何东西。这是一个与平台相关的结果,与浮点运算方式有关。你只是给了OP他们自己的代码,并说试试。@StoryTeller不是“他们自己的代码”。与问题中的代码不同,这个答案中的代码应该在这里,适用于任何正确地将FLT_EVAL_方法定义为零的编译器,尽管有趣的是,对于正确地将FLT_EVAL_方法定义为2.FWIW的编译器,0.7 double正好是0.699999999955591079014993733830543763671875,而0.7f浮动正好是0.69999988079071044921875。因此,浮点值略小于0.7的双精度表示。
 #include <stdio.h>

    int  main(void)
    {

    float a,b,c,temp;
    temp=0.7;
    b=0.7;

    if( b<temp )
        printf(" It should NOT be here");
    else
        printf("It Should be here");


    }