Ответ 1
он отлично работает с длинным поплавком,% lf
Мой управляемый объект имеет два двойных поля: "широта", "долгота". Мне нужно получить все объекты, имеющие определенные координаты
Этот код не работает, 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"];
он отлично работает с длинным поплавком,% lf
Никогда не используйте ==
для сравнения значений с плавающей запятой.
Если вы хотите найти объекты с "конкретным" значением, сравните их с небольшим диапазоном. В противном случае, ошибка представления с плавающей точкой укусит вас.
Так что рассмотрите возможность использования:
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];
Это потому, что точность поплавок не равна 100%. Таким образом, вы также можете сделать это:
[NSPredicate predicateWithFormat:@"abs(latitude - %f) < 0.0001 AND abs(longitude - %f) < 0.0001", coordinate.latitude, coordinate.longitude]
Преобразуйте в NSNumber, используя это:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude == %@ AND longitude == %@", @(coordinate.latitude), @(coordinate.longitude)];