Сравнение двух равных 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 ответа:
Попробуйте вот что:
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 }