4

到目前为止,这还不是问题,但从今天开始,我遇到了一个奇怪的问题,这种问题并不总是发生,但很少发生,我会说 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
}

正如你所看到的,我没有比较 using==或任何东西,因为这些是浮点数......(比如,它不应该与比较浮点值有多危险?现在应该)

我遇到的问题是我遇到了两个值准确的情况,但比较结果为是。在我的例子中,这两个值都是“8926.5”——这个值是我从 LLDB 得到的。这有什么好的解释吗???(我认为 LLDB 会四舍五入这两个值,这意味着它们实际上可能是其他值 - 但为什么这也会在运行时发生?)

这种让我很反感,因为我不能只看到问题......好吧,我正在考虑强制浮动到 int 只是为了这个比较,这一次我可以使用它,但我觉得这个问题最好完全理解:-P

4

2 回答 2

7

尝试这个:

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. 但是,如果您使用LLDBorpo语句打印这些值,两者都将显示 8926.5 。所以问题在于值,并LLDB包装了值。这就是问题发生的原因。

建议

更改 if 条件,如:

if(fabsf(MYFIRSTFLOAT)<fabsf(THESECONDFLOAT))
{
  //Do something
}
于 2013-05-23T08:34:28.907 回答
0

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

于 2013-05-23T08:20:23.730 回答