Сравнение двух равных CGFloat:s, получение положительного (да) результата


До сих пор это не было проблемой, но примерно с сегодняшнего дня я столкнулся со странной проблемой, которая не происходит все время, но редко, я бы сказал, один раз из 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
}

Как вы можете видеть, я не сравниваю использование == или что-нибудь, потому что это поплавки... (например, это не должно быть связано с Насколько опасно сравнивать значения с плавающей точкой? теперь должно быть)

А проблема у меня в том, что я бегу в том случае, когда оба значения являются точными, но сравнение дает оценку "да". В моем случае оба значения являются "8926.5" - это значение я получил от LLDB. Есть ли этому хорошее объяснение??? (Я думаю, что LLDB округляет оба значения, что означает, что они могут быть другими значениями на самом деле - но почему тогда это также произойдет во время выполнения?)

Это меня отталкивает, потому что я не могу просто увидеть проблему... ну, я думаю о том, чтобы заставить поплавки войти только для этого сравнения, и это может быть нормально для моего использования в этот раз, но я чувствую, что эта проблема должна быть полностью понята : - P

2 2

2 ответа:

Попробуйте вот что:

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
}

Да, потому что это значения с плавающей точкой, и у них есть проблема арифметики с плавающей точкой. даже значение кажется одинаковым, но есть разница в десятичных значениях, в то время как они хранятся в памяти, т. е. в представлении памяти