比较两个相等的CGFloat:s,得到正(YES)结果

时间:2013-05-23 08:10:14

标签: ios cgfloat

到目前为止,这不是一个问题,但从今天开始我遇到了一个不会一直发生的奇怪问题,但很少,我会说50次中有一次,甚至更少。

我正在比较两个CGFloat:这样:

const CGFloat MYFIRSTFLOAT = /* get the first value */
const CGFloat THESECONDFLOAT = /* get the second value */
if (MYFIRSTFLOAT < THESECONDFLOAT) {
// do something
}
else {
// Do something else
}

正如你所看到的那样,我不是在使用==或其他任何东西进行比较,因为它们是浮点数......(就像它现在不应该与How dangerous is it to compare floating point values?相关)

我遇到的问题是我遇到两个值完全匹配的情况,但比较评估为YES。在我的情况下,两个值都是“8926.5” - 这是我从LLDB获得的值。有没有一个很好的解释??? (我认为LLDB对这两个值进行了舍入,这意味着它们可能真的是其他值 - 但为什么这也会在运行时发生呢?)

这种让我失望的原因我不能只看到问题......好吧,我正在考虑强制浮动只用于这个比较的int,这次我可能没问题,但是我觉得最好完全理解这个问题:-P

2 个答案:

答案 0 :(得分:6)

试试这个:

const CGFloat a = 8926.5;
const CGFloat b = 8926.5;
if (a<b)
{
    NSLog(@"Yes");
}
else
{
    NSLog(@"No");
}

这将打印No

现在更改值

const CGFloat a = 8926.5;
const CGFloat b = 8926.50007;

这将打印Yes。但是如果使用LLDBpo语句打印这些值,则两者都将显示8926.5。所以问题在于值,LLDB包含了值。这就是问题发生的原因。

<强>建议

更改if条件,如:

if(fabsf(MYFIRSTFLOAT)<fabsf(THESECONDFLOAT))
{
  //Do something
}

答案 1 :(得分:0)

是的,因为它们是浮点值,并且它们存在浮点运算的问题。即使值看起来相同,但小数点值存在差异,而这些存储在存储器中,即存储器表示