какао - ЕСЛИ не удвоится? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть набор NSTimeIntervals, как это:

NSArray *mySet = [NSArray arrayWithObjects:
  [NSNumber numberWithDouble: time1], //
  [NSNumber numberWithDouble: time2], 
  [NSNumber numberWithDouble: time3], 
  nil];

// suppose that at this time
// time1 = 0.00000
// time2 = 18.3200
// time3 = 21.6500

В какой-то момент моего кода я хочу проверить, является ли currentTime большим или равным одному из значений в массиве, поэтому я делаю

// currentTime = 18.32 right now
for (int i=0; i<[mySet count]; i++) {
  if (currentTime >= [[mySet objectAtIndex:i] doubleValue]) {
    NSLog(@"%d...", i);
  }
}

Вывод должен быть "1 ... 2 ..." но вывод просто "1 ..."

когда i = 1 , он сравнивает 18.32 с 18.32 и не может распознать, что значение равно или больше, чем другое? ВТФ ???

Как это может быть?

спасибо за любую помощь.

Ответы [ 4 ]

5 голосов
/ 18 марта 2010

Как правило, сравнивая значения с плавающей запятой, вы хотите решить, насколько близко одно должно быть к другому ( epsilon или граница ошибки), а затем просто проверьте, находятся ли они в этом. Самый простой способ сделать это - вычесть одно из другого, а затем проверить, является ли абсолютное значение результата меньше или равно вашему epsilon .

псевдокод:

 var values = [...];
 var toCheck = ...;
 var epsilon = 0.00001;

 for (var i = 0; i < length(values); ++i)
      if (abs(values[i] - toCheck) <= epsilon)
          print "they are close enough"
      end
 end
2 голосов
/ 18 марта 2010

Если вы пытаетесь сделать точные вычисления, вы не должны использовать NSNumber, но NSDecimalNumber. Первый - это просто оболочка для хранения чисел как объектов, а второй предназначен для сохранения точности при выполнении вычислений. Он работает лучше, чем скаляры на экстремальных расстояниях.

См. Темы программирования чисел и значений для какао

0 голосов
/ 19 марта 2010

Вы объявляете var i как int, а затем пытаетесь записать его как двойное значение без приведения. Журнал может не работать независимо от точности вашего теста.

0 голосов
/ 18 марта 2010

Вы не можете сравнивать двойные значения на равенство, за исключением определенных случаев. (1.00000 == 1.0000), вероятно, звучит правдоподобно, но (1.3000 == 1.3000), скорее всего, нет. Это потому, что на самом деле двойники не являются десятичными числами; и не все числа могут быть представлены двойным; ваши значения, скорее всего, что-то вроде 18.320000123 и 18.320000473; так сказать; вероятно, есть много мусора, который не интересен с выбранной вами точностью, но тем не менее не дает им сравниваться как равные.

Это не поможет вам запустить один из них через NSNumber; в два раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...