Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数据类型指定为int、float或double时会产生不同的结果_C - Fatal编程技术网

C 将数据类型指定为int、float或double时会产生不同的结果

C 将数据类型指定为int、float或double时会产生不同的结果,c,C,在编译和运行这个程序时,为什么我们得到的是“更大”而不是“相等”?我检查过,当我们指定数据类型为int时,我们得到“Less”,当指定为double时,我们得到“Equal”。原因是什么 #include <stdio.h> int main(void) { float g = 9.8; if (g == 9.8){ printf("Equal"); } else if (g < 9.8){ printf("Le

在编译和运行这个程序时,为什么我们得到的是“更大”而不是“相等”?我检查过,当我们指定数据类型为
int
时,我们得到“Less”,当指定为
double
时,我们得到“Equal”。原因是什么

#include <stdio.h>

int main(void)
{
    float g = 9.8;
    if (g == 9.8){
        printf("Equal");
    }
    else if (g < 9.8){
        printf("Less");
    }
    else{
        printf("Greater");
    }
    return 0;
}
#包括
内部主(空)
{
浮球g=9.8;
如果(g==9.8){
printf(“相等”);
}
否则,如果(g<9.8){
printf(“减去”);
}
否则{
printf(“更大”);
}
返回0;
}

这是因为
int
截断了该值,这意味着它去掉了小数部分而不进行舍入,因此将
9.8
转换为
int
(int)9.8
得到9

g
类型为
double
时,它返回
equal
,因为默认情况下十进制数为
double

g
是一个
float
时,您可以对
float
double
进行比较,这并不好,因为
double
float
有更多的精度点,这意味着它可能导致不匹配

表达式中使用的值被视为双精度(双精度浮点格式),除非在末尾指定了“f”。因此表达式“g==9.8”的右侧有一个double,左侧有一个以单精度浮点格式存储的float。在这种情况下,float被提升为double。双精度格式比单精度格式使用更多的精度位

更多

但是,如果你这样做,你会得到平等:

#include <stdio.h>

int main(void)
{
    float g = 9.8;

    // Add the f to typecast to float
    if (g == 9.8f) printf("Equal");
    else if (g < 9.8) printf("Less");
    else printf("Greater");

    return 0;
}
#包括
内部主(空)
{
浮球g=9.8;
//将f添加到typecast到float
如果(g==9.8f)printf(“相等”);
如果(g<9.8)printf(“较少”);
else printf(“更大”);
返回0;
}

它不适用于地板。它截断。@DanielA.White你说得对,它确实截断了。这样说是正确的,我会编辑,谢谢。可能值得指出的是,文本
9.8
具有类型
double
。十进制值
9.8
不能完全以二进制开始表示。浮点文本
9.8
的值必须在
g
的赋值中转换为
float
,但此
双精度
值将不适合
float
。结果值是下一个较小的值还是下一个较大的值由实现定义。在比较中,此
浮点
值转换为
双精度
,保留
浮点
的值。