NSPredicate не работают с двойными значениями (% f)? - PullRequest
16 голосов
/ 08 января 2010

Мой управляемый объект имеет 2 двойных поля: "широта", "долгота". Мне нужно выбрать все объекты, которые имеют определенные координаты

Этот код не работает, fetchedObjects count = 0

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude == %f AND longitude == %f", coordinate.latitude, coordinate.longitude];

Но этот код работает нормально, fetchedObjects count = 3:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude == 53.012667 AND longitude == 36.113000"];

Ответы [ 4 ]

30 голосов
/ 08 января 2010

отлично работает с длинным плавающим знаком,% lf

15 голосов
/ 23 октября 2010

Никогда не используйте == для сравнения значений с плавающей запятой.

Если вы хотите найти объекты с «конкретным» значением, сравните их с небольшим диапазоном. В противном случае, ошибка представления с плавающей точкой укусит вас.

Так что рассмотрите возможность использования:

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];
3 голосов
/ 04 ноября 2013

Это потому, что точность поплавков не равна 100%. Так что вы также можете сделать это:

[NSPredicate predicateWithFormat:@"abs(latitude - %f) < 0.0001 AND abs(longitude - %f) < 0.0001", coordinate.latitude, coordinate.longitude]
0 голосов
/ 31 декабря 2015

Преобразовать в NSNumber, используя это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude == %@ AND longitude == %@", @(coordinate.latitude), @(coordinate.longitude)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...