增加双倍从不是完整的

Hip*_*tes 0 objective-c

在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];
}
Run Code Online (Sandbox Code Playgroud)

dre*_*lax 5

浮点类型不能精确地表示某些数字,因此当添加这些数字时,错误会复杂化并且浮点类型变得越来越不精确.

使用整数类型但使用更高的分辨率表示时差,例如,使用a NSUInteger表示毫秒而不是秒,并增加100而不是0.1.而不是比较seconds == 3.0,你会使用milliseconds == 3000等.

请记住,定时器不会被非常精确地触发:

计时器不是实时机制; 只有当添加了计时器的其中一个运行循环模式正在运行并且能够检查计时器的触发时间是否已经过去时,它才会触发.

您可能会发现,milliseconds==9000实际超过9秒(但可能不会更多).如果需要更精确的计时,还有其他工具可用.