iphone/Objective C - 比较 double 不起作用

标签 iphone objective-c ios floating-point

我觉得我快疯了。 “计数器”和“间隔”都是 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

Friday Q&A 2011-01-04: Practical Floating Point

关于iphone/Objective C - 比较 double 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4732645/

相关文章:

iphone - 如何在 objective-c 中使用 id 变量?

css - iphone 5 横向媒体查询失败

ios - MKMapView 在 iPhone 5c 中离开 View Controller 后挂起/卡住应用程序

objective-c - 如何显示相机但不让用户拍照?

ios - 不支持的 URL iOS

ios - 类型 'Int' 的值永远不能为 nil,swift 2.2 中不允许比较

ios - SWRevealViewController 导航栏右键项目

iphone - Core Data 如何存储 NSData?

iphone - 找不到 i386 架构的 Facebook 符号

ios - 更改 MDCTextField 占位符文本的文本换行