Увеличение двойного никогда не является целым - PullRequest
0 голосов
/ 07 октября 2010

В Objective-C я запускаю таймер каждые 0,1 секунды и увеличиваю двойное значение (секунды) на 0,1.

Так что он должен продолжать отсчитывать время на 1/10 секунды.Когда он запускается, он проверяет некоторые операторы if - else, чтобы узнать, равно ли время (секунды) 3, 9, 33 и т. Д., Но они никогда не срабатывают.Я полагаю, это из-за того, что двойные числа представлены в битах, то есть десятичная дробь является приближением, а не целым числом.

Как я могу это исправить, чтобы мои операторы срабатывали?

-(void)timeSeconds:(NSTimer*)theTimer {
seconds = seconds + 0.1;
NSLog(@"%f", seconds);
if (seconds == 3.0) {
    [player pause];
    [secondsTimer invalidate];
}
else if (seconds == 9){
    [player pause];
    [secondsTimer invalidate];
}

Ответы [ 3 ]

5 голосов
/ 07 октября 2010

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

Используйте интегральный тип, но представляйте разницу во временинапример, для более высокого разрешения используйте NSUInteger, чтобы представить миллисекунды вместо секунд, и увеличьте на 100 вместо 0,1.Вместо сравнения seconds == 3.0 вы должны использовать milliseconds == 3000 и т. Д.

Имейте в виду, что таймеры не работают очень точно :

Таймерне механизм реального времени;он срабатывает только тогда, когда работает один из режимов цикла выполнения, к которому был добавлен таймер, и он может проверить, прошло ли время срабатывания таймера.

Вы можете обнаружить, что когда milliseconds==9000, большефактически прошло более 9 секунд (но, вероятно, не намного).Если требуются более точные сроки, доступны другие инструменты.

4 голосов
/ 07 октября 2010

0.1 нельзя представить точно в двоичной форме с плавающей запятой, поэтому вы получите небольшую ошибку, которая накапливается с течением времени.Если вам нужно точное значение, используйте переменную типа int или long, которая увеличивается на 1 каждый раз и называется tenthsOfSeconds.

2 голосов
/ 07 октября 2010

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

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