iOS中1000和1000.0之间的差异

时间:2011-12-11 13:50:02

标签: objective-c ios nstimer

这里我有一个设置NSTimer对象的fireDate的代码。

-(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,它是一个double的typedef。但我不能把10.0写成10只? .0如何影响价值?

4 个答案:

答案 0 :(得分:6)

当您只编写1000时,编译器意味着整数类型。因此,当划分两个整数(startTime是long并且1000可能是int)时,它将是整数除法,从而得到精确(精确)比率的最低值。例如,2500/1000将为2.但是,当您将1000写为1000.0时,编译器会发出一个浮点数。除以float的整数结果为float,因此2500 / 1000.0将为2.5,如预期的那样。基本上这就是为什么在简单使用整数时缩短间隔的原因。 (换句话说,这就是整数除法抛弃模数除以除数的事实。)

答案 1 :(得分:3)

由于整数/长整数完全删除了小数部分,并且因为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 :(得分:2)

使用1000,因为startTime也是一个整数类型,所以得到整数除法。即如果startTime小于1000,则该除法将产生0。

使用1000.0,您会得到一个浮点除法,看起来就像您想要的那样。

答案 3 :(得分:1)

.0使值为浮点而不是int。除了整数,你也得到一个int;也就是说,1/2 = 0.当你划分浮点数时,你得到一个浮点数,即1.0 / 2.0 = 0.5。