我写了以下代码:
#include <stdio.h>
int main ()
{
float x = 1.1;
printf("%s\n", "Hello!");
while (x == 1.1)
{
printf("%s\n", "Hey there!");
printf("%f\n", x);
x = x - 0.1;
}
printf("%s\n", "Bye!");
return 0;
}
然而输出是(我认为不是预期的):
aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ gcc C04Ag.c
aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ ./a.out
Hello!
Bye!
为了检查它是否接受浮动条件,我写了这段代码:
#include <stdio.h>
int main ()
{
float x = 1.1;
printf("%s\n", "Hello!");
while (x >= 1.0)
{
printf("%s\n", "Hey there!");
printf("%f\n", x);
x = x - 0.1;
}
printf("%s\n", "Bye!");
return 0;
}
我按照预期得到了输出。
aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ gcc C04Ag.c
aps120797@XENON-PC:/mnt/d/Codes/LetUsC$ ./a.out
Hello!
Hey there!
1.100000
Hey there!
1.000000
Bye!
所以,我的问题是,我在第一段代码中做错了什么?
UPDTATE :刚想出如何纠正此错误。
像这样附加while条件:while (x == 1.1f)
答案 0 :(得分:1)
1.1
不是float
值,而是double
值。
当您编写float x = 1.1;
时,编译器会插入隐式强制转换:float x = (float)1.1;
。
当您编写x == 1.1
时,编译器会插入另一个隐式转换:(double)x == 1.1
。
因此,您有效地测试1.1在将其转换为float
并返回double
之后是否仍然是相同的值 - 即(double)(float)1.1 == 1.1
是否为真。
(double)(float)1.1 == 1.1
不正确。至少在我的平台上:
1.1
实际上是1.100000000000000088817841970012523233890533447265625
(double)(float)1.1
实际上是1.10000002384185791015625
正如您所看到的,这两个数字并不相同。