为什么0 == CGFLOAT_MIN是假的?

时间:2017-02-08 03:05:02

标签: objective-c

为什么0直接比较时不等于CGLOAT_MIN

我的代码

float minVar = CGFLOAT_MIN;

printf("CGFLOAT_MIN = %f\n\n", CGFLOAT_MIN);
printf("0 == CGFLOAT_MIN  \t%s\n", (0) == CGFLOAT_MIN ? "true" : "false");
printf("0 == minVar       \t%s\n", (0) == minVar ? "true" : "false");
printf("0 == 0.000000     \t%s\n", (0) == 0.000000 ? "true" : "false");

输出

CGFLOAT_MIN = 0.000000

0 == CGFLOAT_MIN    false
0 == minVar         true
0 == 0.000000       true

1 个答案:

答案 0 :(得分:4)

因为CGFLOAT_MIN 等于0.这是CGFloat可以容纳的最小可表示正非零值。

printf("CGFLOAT_MIN = %f\n\n", CGFLOAT_MIN);

这会打印0.000000,因为%f说明符默认舍入到6个小数位。 CGFLOAT_MIN以相对粗略的精度水平向下舍入为零。

float minVar = CGFLOAT_MIN;
// ...
printf("0 == minVar       \t%s\n", (0) == minVar ? "true" : "false");

这打印为true,因为在为64位构建时,CGFloat相当于double,而不是floatfloat精度较低;它无法正确表示CGFLOAT_MIN的值。同样,转换为float会将其舍入为0.因此,minVar等于0,即使CGFLOAT_MIN不是。