比较 0.55 和 0.55f 时的错误结果
Wrong result when comparing 0.55 and 0.55f
在 C 中,0.55 == 0.55f
为假,而 0.5 == 0.5f
为真。为什么不同?
比较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.5
是一个 dyadic rational 并且大小合适所以 0.5
正好是 one-half 作为 float
或 double
.
0.55
则不同。 double
将存储该数字,其精度不低于 float
,而且很可能更高。
在这两种情况下,float
在 ==
之前隐式转换为 double
,但到那时已经发生任何截断。
您正在比较两种不同类型的值,即双精度值和浮点型。考虑不精确数字的大小限制。
精确值(十进制)
A -> 1/2 有 5 位小数是 0.5000
B -> 1/2 有 10 位小数是 0.5000000000
A == B 总是 return true
不精确的值(十进制)
A -> 1/3 有 5 位小数是 0.33333
B -> 1/3 有 10 位小数是 0.3333333333
A == B -> 总是 return false 因为它们不一样。
同样,0.55 不能用二进制精确表示,但 0.5 可以。
0.55d的二进制表示 -> 0.10001100110011001101...
所以他们不会相等
0.5d的二进制表示->0.1
所以他们会相等
希望能解开你的疑惑
在 C 中,0.55 == 0.55f
为假,而 0.5 == 0.5f
为真。为什么不同?
比较
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.5
是一个 dyadic rational 并且大小合适所以 0.5
正好是 one-half 作为 float
或 double
.
0.55
则不同。 double
将存储该数字,其精度不低于 float
,而且很可能更高。
在这两种情况下,float
在 ==
之前隐式转换为 double
,但到那时已经发生任何截断。
您正在比较两种不同类型的值,即双精度值和浮点型。考虑不精确数字的大小限制。
精确值(十进制)
A -> 1/2 有 5 位小数是 0.5000
B -> 1/2 有 10 位小数是 0.5000000000
A == B 总是 return true
不精确的值(十进制)
A -> 1/3 有 5 位小数是 0.33333
B -> 1/3 有 10 位小数是 0.3333333333
A == B -> 总是 return false 因为它们不一样。
同样,0.55 不能用二进制精确表示,但 0.5 可以。
0.55d的二进制表示 -> 0.10001100110011001101...
所以他们不会相等
0.5d的二进制表示->0.1
所以他们会相等
希望能解开你的疑惑