增加双倍从不是完整的

时间:2010-10-07 00:24:16

标签: 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];
}

3 个答案:

答案 0 :(得分:5)

浮点类型不能准确表示某些数字,因此添加这些数字时,错误会复杂化,浮点类型的精确度会越来越低。

使用整数类型,但使用更高的分辨率表示时差,例如,使用NSUInteger表示毫秒而不是秒,并增加100而不是0.1。您可以使用seconds == 3.0

来代替milliseconds == 3000

请注意,计时器不会被precisely

解雇
  

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

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

答案 1 :(得分:4)

0.1无法在二进制浮点中精确表示,因此您会得到一个随时间累积的小错误。如果你想要一个精确的值,使用一个int或long变量,每次调用tenthsOfSeconds时增加1。

答案 2 :(得分:2)

浮点数学是不精确的,使用浮动计数不是一个好主意,但如果必须,请检查计数和变量之间的差异是非常小的。