我有以下代码
案例1
float a=1.7;
if(a==1.7)
{
printf("Equal\n");
}
else if(a<1.7)
{
printf("less\n");
}
else{
printf("Greater\n");
}
输出
Greater
案例2
float a=1.3;
if(a==1.3)
{
printf("Equal\n");
}
else if(a<1.3)
{
printf("less\n");
}
else{
printf("Greater\n");
}
输出
Less
为什么输出不符合预期?
为什么两种情况下的输出都不同?
谁能解释这些值是如何存储和比较的
提前致谢
答案 0 :(得分:2)
组合事物 -
内部C使用double; float是一种存储格式。
1.3是以二进制
IEEE浮点数在存储时对尾数进行舍入。 1.3存储为float获取 向下舍入,1.7向上舍入(一点点)
当读取时,浮点数a将通过添加额外的数字转换为双精度数 最低有效位设置为0。向下舍入的值小于它们 是。向上舍入的值(即使它们以全零结尾)更大。
当比较1.xyzxyz000000和1.xyzxyzxyzxyz时,其中并非所有xyz都为0, 以零结尾的那个会少一些。
编辑:早先错过了ieee舍入方面
对于好奇,这里是存储为1.3和1.7的实际值作为32位浮点数:
1.299999952316284179687500000000
1.700000047683715820312500000000
和64位浮点数:
1.30000000000000004440892098500626161694526672363281250000000000000000
1.69999999999999995559107901499373838305473327636718750000000000000000
答案 1 :(得分:2)
当您为文本分配float
然后将结果与同一文字进行比较时,您应该看到值相等。问题是,在您的代码中,您没有将float
与float
进行比较:这是float
到double
的比较。
常量1.7
和1.3
属于double
类型。当您将它们与float
进行比较时,float
的值会在比较之前扩展为double
。这是值变得不相等的阶段:除非精确表示常量(1.7
和1.3
都不能用浮点数表示),否则会出现转换错误。< / p>
您可以通过与float
常量进行比较来解决此问题:如果在比较之前将常量强制转换为float
,则等式检查将成功:
float a=1.7;
if(a==(float)1.7) {
printf("Equal\n");
} else if(a<(float)1.7) {
printf("less\n");
} else {
printf("Greater\n");
}
Demo(打印Equals
)。
答案 2 :(得分:1)
在检查案例时,它会考虑一个整数。所以它会将浮动值四舍五入到 整数。
1.7 roundup as 2.
1.3 roundup as 1.
所以这就是答案的原因。