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

Jon*_*nny 3 cgfloat ios

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

我正在比较两个CGFloat:s是这样的:

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

你可以看到我没有比较使用==或任何东西,因为它们是浮点数...(比如,它应该与比较浮点值的危险程度无关现在应该如此)

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

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

Mid*_* MP 6

试试这个:

const CGFloat a = 8926.5;
const CGFloat b = 8926.5;
if (a<b)
{
    NSLog(@"Yes");
}
else
{
    NSLog(@"No");
}
Run Code Online (Sandbox Code Playgroud)

这将打印No.

现在更改值如

const CGFloat a = 8926.5;
const CGFloat b = 8926.50007;
Run Code Online (Sandbox Code Playgroud)

这将打印Yes.但是如果使用LLDBpo声明打印这些值,则两者都将显示8926.5.因此问题在于值,并LLDB包装值.这就是问题发生的原因.

建议:

更改if条件,如:

if(fabsf(MYFIRSTFLOAT)<fabsf(THESECONDFLOAT))
{
  //Do something
}
Run Code Online (Sandbox Code Playgroud)