到目前为止,这不是一个问题,但从今天开始我遇到了一个不会一直发生的奇怪问题,但很少,我会说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
试试这个:
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.但是如果使用LLDB或po声明打印这些值,则两者都将显示8926.5.因此问题在于值,并LLDB包装值.这就是问题发生的原因.
建议:
更改if条件,如:
if(fabsf(MYFIRSTFLOAT)<fabsf(THESECONDFLOAT))
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)