这是代码。
#include<stdio.h>
int main()
{
float i=4.05;
if(i==4.05)
printf("Condition True");
else
printf("Condition False");
return 0;
}
此代码显示错误输出。我不知道为什么条件为真,而不是输出为假的原因。
但是这段代码显示了正确的输出。
#include<stdio.h>
int main()
{
float i=4.5;
if(i==4.5)
printf("Condition True");
else
printf("Condition False");
return 0;
}
答案 0 :(得分:4)
4.5
和4.05
是double
文字。您将它们分配给float
,这需要可能有损转换(舍入),然后再将它们与同一文字进行比较,从而将float
提升为double
。第二次转换始终是精确的,但它无法撤消在第一次双重&gt;浮点转换期间发生的舍入错误。
(double)(float)4.5
等于4.5
,因为二进制浮点的内部表示:4.5 = 9/2 = 9 * 2 -1 。这完全由float和double表示。
(double)(float)4.05
不等于4.05
,因为4.05无法在基数2(具有有限位数)中精确表示:它是405/10 = 405 * 2 -1 * 5 -1 。 5 -1 因子在基数2中是周期性的。因此当将4.05表示为float或double时,它会舍入到相应类型可以容纳的位数(浮点数为24位,双精度值为53) ,这当然导致不同的数字(尝试将2/3四舍五入到四位二位数和六位小数)。