NSPredicate不能使用双值(%f)?

abu*_*sky 16 iphone core-data

我的托管对象有2个双字段:"纬度","经度".我需要获取具有特定坐标的所有对象

此代码不起作用,fetchedObjects count = 0

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude == %f AND longitude == %f", coordinate.latitude, coordinate.longitude];
Run Code Online (Sandbox Code Playgroud)

但是这段代码工作正常,fetchedObjects count = 3:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude == 53.012667 AND longitude == 36.113000"];
Run Code Online (Sandbox Code Playgroud)

abu*_*sky 33

它适用于long float,%lf

  • 正如jdeprez所说,你不应该比较浮动值.比较浮动值是危险和不好的做法.相反,使用相当大的区域作为谓词,然后计算距离返回对象数组最近的点的距离. (3认同)

小智 15

哦,天啊......

不要==用来比较浮点值.

如果要查找具有"特定"值的对象,请与较小范围进行比较.否则,浮点表示错误会咬你.

所以考虑使用:

const float epsilon = 0.000001;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude > %f AND latitude < %f AND longitude > %f AND longitude < %f", coordinate.latitude - epsilon,  coordinate.latitude + epsilon, coordinate.longitude - epsilon, coordinate.longitude + epsilon];
Run Code Online (Sandbox Code Playgroud)

  • Clang的** float.h **定义了一些与float和double有关的常量。其中两个是`FLT_EPSILON`(1E-5)和`DBL_EPSILON`(1E-9),应使用它们代替此处给出的epsilon 1E-6。这些常量的特性由[C99 5.2.4.2.2](http://c0x.coding-guidelines.com/5.2.4.2.2.html)定义。 (2认同)