在C中,0.55 == 0.55f
为假,而0.5 == 0.5f
为true。为什么不同?
比较0.55
:
#include <stdio.h>
int main() {
if (0.55 == 0.55f)
printf("Hi");
else
printf("Hello");
}
输出Hello
。
比较0.5
:
#include <stdio.h>
int main() {
if (0.5 == 0.5f)
printf("Hi");
else
printf("Hello");
}
输出Hi
。
对于这两个代码段,我都希望使用Hello
。
为什么会有这种差异?
答案 0 :(得分:4)
0.5
是dyadic rational,大小合适,因此0.5
恰好是float
或double
的一半。
0.55
不能说相同。 double
将以不小于float
且最有可能更高的精度存储该数字。
在两种情况下,float
都隐式转换为double
之前的==
,但是到那时,所有截断都发生了。
答案 1 :(得分:3)
您正在比较两种不同类型的值,即double和float。考虑数字不精确的大小限制。
A-> 1/2(含5个小数)是0.5000
B-> 1/2(含10个小数)是0.5000000000
A == B将始终返回true
A-> 1/3(带5个小数)是0.33333
B-> 1/3(含10个小数)是0.3333333333
A == B->总是返回false,因为它们不相同。
类似地,不能精确地用二进制表示0.55,但是可以精确地表示0.5。
0.55d的二进制表示形式-> 0.10001100110011001101 ...
因此它们将不相等
0.5d-> 0.1的二进制表示形式
所以它们将相等
希望它消除了您的疑问