Разница между 1000 и 1000.0 в iOS - PullRequest
0 голосов
/ 11 декабря 2011

Здесь у меня есть код, который устанавливает fireDate объекта NSTimer.

-(void)TimerFired:(NSTimer*)timer{
    long startTime=random()%1500+500;
    [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:startTime/1000.0]];
    [controller startCarFromLane:self];
}

В приведенном выше коде, когда я пишу: startTime / 1000.0, таймер срабатывает через достаточно большое количество времени. Но если я изменю его на: startTime / 1000 (без .0), следующий fireDate таймера отличается от случая выше, таймер срабатывает чаще. Я знаю, что метод dateWithTimeIntervalSinceNow ожидает NSTimeInterval, который является typedef типа double. Но я не могу написать 10.0 как просто 10? Как .0 может повлиять на значение?

Ответы [ 4 ]

6 голосов
/ 11 декабря 2011

Когда вы просто пишете 1000, компилятор подразумевает целочисленный тип. Таким образом, при делении двух целых чисел (startTime - это long, а 1000 - это, вероятно, int), это будет целочисленное деление, что приведет к полу точного (точного) соотношения. Например, 2500/1000 будет 2. Однако, когда вы пишете 1000 как 1000.0, компилятор генерирует число с плавающей запятой. Целое число, разделенное на число с плавающей точкой, приводит к числу с плавающей точкой, поэтому 2500 / 1000.0 будет 2,5, как и ожидалось. По сути, именно поэтому вы получаете более короткие интервалы, просто используя целое число. (Другими словами, это тот факт, что целочисленное деление отбрасывает деление по модулю на делитель).

3 голосов
/ 11 декабря 2011

Поскольку целочисленное / длинное деление полностью удаляет десятичную часть, а ваш startTime объявлен как long, результатом startTime/1000 является целое число. Результат startTime/1000.0 является двойным, потому что 1000.0 приводит к результату деления на double. Вы также можете указать тип как double в явном виде, как показано ниже:

-(void)TimerFired:(NSTimer*)timer{
    double startTime=random()%1500+500;
    [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:startTime/1000]];
    [controller startCarFromLane:self];
}
2 голосов
/ 11 декабря 2011

С 1000, поскольку startTime также является целочисленным типом, вы получаете целочисленное деление. То есть если startTime меньше 1000, то это деление даст 0.

С 1000.0 вы получаете деление с плавающей запятой, которое выглядит как то, что вы хотите здесь.

1 голос
/ 11 декабря 2011

.0 делает значение плавающим вместо целого.Когда вы делите целые числа, вы также получаете int;то есть 1/2 = 0. Когда вы делите поплавки, вы получаете поплавок, то есть 1,0 / 2,0 = 0,5.

...