我觉得我快疯了。 “计数器”和“间隔”都是 double 。这是在 accelerometer:didAccelerate 上发生的,间隔为 (.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) );
最佳答案
永远不要将 double 或 float 与相等性进行比较 - 它们可能在您正在检查的有效数字的数量上看起来相同,但计算机看到的更多。
为此,Foundation Framework 为“float”和“double”等不同类型提供了“epsilon”值。如果两个数之间的距离小于 epsilon,则可以认为这两个数相等。
在您的情况下,您可以按如下方式使用它:
- (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
}
两个非常有用的链接:
What Every Computer Scientist Should Know About Floating-Point Arithmetic
Interesting discussion of Unit in Last Place (ULP) and usage in Swift
关于iphone/Objective C - 比较 double 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4732645/