iPhone /目标C – 比较双打不工作

我想我疯了。 “柜台”和“间隔”都是双打。 加速度计上发生这种情况:以(.01)为间隔进行加速度计算。 “柜台”最终应该增加到“间隔”。 出于某种原因,我不能得到这个“如果”是真实的。

我可以俯视吗?

double interval = .5; if( counter == interval ){ //should eventually be .50000 == .50000 NSLog( @"Hit!" ); [self playSound]; counter = 0; }else{ counter += .01; } NSLog( @"%f, %f, %d",counter,interval,(counter == interval) ); 

千万不要把双打或花车比作平等 – 他们可能看起来与你正在检查的有效数字相同,但电脑看的更多。

为此,Foundation Framework为不同types提供了“epsilon”值,例如“float”和“double”。 如果两个数字之间的距离小于ε,则可以假设这两个数字相等。

在你的情况下,你会使用它如下:

 - (BOOL)firstDouble:(double)first isEqualTo:(double)second { if(fabs(first - second) < DBL_EPSILON) return YES; else return NO; } 

或者在Swift 4:

 func doublesAreEqual(first: Double, second: Double) -> Bool { if fabs(first - second) < .ulpOfOne { return true } return false } 

两个非常有用的链接:

计算机科学家应该知道什么是浮点运算

星期五问答2011-01-04:实用浮点

在你的else块中,你没有添加0.01到计数器,因为这不是一个可表示的双精度值。 你实际上增加了价值:

 0.01000000000000000020816681711721685132943093776702880859375 

毫不奇怪,当你重复地把这个值添加到自己,你永远不会得到0.5

两个选项:更好的是用(counter >= interval)代替if条件。 或者,您可以使用两个小的幂作为增量,而不是无法表示的东西,如0.0078125