到目前为止,这不是一个问题,但从今天开始我遇到了一个不会一直发生的奇怪问题,但很少,我会说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
答案 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
。但是如果使用LLDB
或po
语句打印这些值,则两者都将显示8926.5。所以问题在于值,LLDB
包含了值。这就是问题发生的原因。
<强>建议强>:
更改if条件,如:
if(fabsf(MYFIRSTFLOAT)<fabsf(THESECONDFLOAT))
{
//Do something
}
答案 1 :(得分:0)
是的,因为它们是浮点值,并且它们存在浮点运算的问题。即使值看起来相同,但小数点值存在差异,而这些存储在存储器中,即存储器表示