Подтвердить что ты не робот

NSPredicate не работает с двойными значениями (% f)?

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

Этот код не работает, 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"];
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

[NSPredicate predicateWithFormat:@"abs(latitude - %f) < 0.0001 AND abs(longitude - %f) < 0.0001", coordinate.latitude, coordinate.longitude]

Ответ 4

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

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