Да, я прочитал другие сообщения о stackoverflow о сравнении NSNumber, и ни один из них, похоже, не справляется с этой конкретной ситуацией.
Это решение было особенно плохо ... NSNumber compare: returning different results
Поскольку предлагаемое решение не работает вообще. Использование абс (значение1 - значение2) < Допуск устранен с самого начала, поскольку дробные значения удаляются, что делает допущение несущественным.Сравнение экземпляров NSNumber с isEqualToNumber
И из документации Apple ... NSNumber явно не гарантирует, что возвращаемый тип будет соответствовать методу, используемому для его создания. Другими словами, если вам присвоен NSNumber, у вас нет способа определить, содержит ли он float, double, int, bool или что-то еще.
Кроме того, насколько я могу судить, NSNumber isEqualToNumber является ненадежным методом сравнения двух NSNumbers.
Поэтому, учитывая эти определения ...
NSNumber *float1 = [NSNumber numberWithFloat:1.00001];
NSNumber *double1 = [NSNumber numberWithDouble:1.00001];
Если вы запустите отладчик, а затем сделать 2 сравнение этих одинаковых чисел с помощью ==, один выходит из строя, а другие нет.
p [double1 floatValue] == [float1 floatValue] **// returns true**
p [double1 doubleValue] == [float1 doubleValue] **// returns false**
Если сравнить их с помощью isEqualToNumber
p [float1 isEqualToNumber:double1] **// returns false**
Так что если isEqualToNumber собирается вернуться ложным, учитывая, что создание NSNumber черный ящик, который может дать вам какой-либо другой тип на пути я не уверен, какой хороший способ.
Итак, если вы собираетесь провести проверку на наличие загрязнений, потому что существующее значение было изменено на новое значение ... какой самый простой способ сделать это, чтобы обрабатывать все сопоставления NSNumber .. не просто плавать и двойной, но все NSNumbers?
Кажется, что преобразование в строковое значение, тогда сравнение было бы наиболее полезным или, возможно, большим количеством дополнительного кода с использованием NSNumberFormatter.
Что вы думаете?
Вашего 'float3' не включает в себя определение. Возможно, вы имели в виду 'float1'? –
Ой, да, я исправлю. –
@ user3055655 Вам, вероятно, просто нужно использовать 'fabs' или' fabsf' для проверки допуска, а не 'abs' –