Определите, является ли NSNumber NaN - PullRequest
42 голосов
/ 05 апреля 2009

Как я могу определить, представляет ли номер какао NSN NaN (а не число)?

Это появляется, например, когда я анализирую строку с недопустимым (не числовым) содержимым.

Ответы [ 9 ]

64 голосов
/ 05 апреля 2009

Итак, я обнаружил, что свойство класса [NSDecimalNumber notANumber] как раз для этой цели. В некоторых языках NaN! = NaN, но в Какао это не так.

16 голосов
/ 07 апреля 2009

Как говорит Майк Абдулла, естественным способом представления NaN в Какао является nil, но [NSNumber numberWithDouble:NAN] возвращает действительный объект. Не существует NSNumber -специфичного способа обнаружения этого, но общий способ isnan([foo doubleValue]) работает. Если вам не нравятся функции, вы можете поместить их в категорию.

12 голосов
/ 29 июня 2011

Для десятичных чисел, по крайней мере:

[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]
10 голосов
/ 15 ноября 2012

Чтобы определить, является ли NSNumber NaN, конвертируйте его в double и используйте функцию C isnan():

NSNumber *validNumber = [NSNumber numberWithDouble: 1.];
NSLog( @"%d", isnan(validNumber.doubleValue) ); // prints "0"

NSNumber *nanNumber = [NSNumber numberWithDouble: 0./0.];
NSLog( @"%d", isnan(nanNumber.doubleValue) ); // prints "1"

Тем не менее, вы должны быть осторожны, потому что есть другие специальные значения, например:

NSNumber *posInfinity = [NSNumber numberWithDouble: 1./0.];
NSLog( @"%d", isnan(posInfinity.doubleValue) ); // prints "0"

Если вы хотите проверить и эти значения, лучше использовать isnormal() вместо:

NSLog( @"%d", isnormal(validNumber.doubleValue) ); // prints "1"
NSLog( @"%d", isnormal(nanNumber.doubleValue) ); // prints "0"
NSLog( @"%d", isnormal(posInfinity.doubleValue) ); // prints "0"
8 голосов
/ 04 августа 2012

Я обнаружил, что это работает, но это законно?

NSNumber *NaN = [NSDecimalNumber notANumber];

NSDecimalNumber *x = ... fill it somehow with NaN content ...

if ( x == NaN ) ... this works

гарантируется ли NaN постоянным значением singleton? Было бы здорово, но я полагаю, что это не так, поскольку во всех найденных примерах используются методы isEqual.

5 голосов
/ 21 января 2010

есть также функция isnan (), которую я нашел сегодня.

2 голосов
/ 04 августа 2014

Мы также можем использовать #define, определенный в math.h как follws

if(isnan(myNumber))
{  // myNumber is NaN .

}

0 голосов
/ 25 октября 2010

Любое логическое выражение с NaN всегда будет возвращать false. Но как это полезно?

Я возвращал Нэн из locationInView: во время обработки некоторых жестов в приложении для iPhone. И был очень рад обнаружить, что любое булево выражение с NaN всегда будет возвращать false. Я поставил это, чтобы использовать lik ниже:

// Я использовал UIPanGestureRecognizer, и кажется, что в TouchUp я получил бы Nan для / location .x - .y - довольно разумно, так как в этом случае конец касания не имеет местоположения.

CGPoint location = [gestureRecognizer locationInView:self];

if ( location.x != location.x || location.y != location.y )
{
 return;
}

Так что, так как длинные .x и .y или допустимые значения с плавающей точкой, конечно, они никогда не будут равны собственной стоимости. НО в случае, если .x или .y являются NaN, сравнение будет ложным. И я могу безопасно избежать вычислений с Наном.

0 голосов
/ 06 апреля 2009

На самом деле нет такого объекта для NSNumber, так как если это не число, то, ну, это не NSNumber. Для представления этого более обычно использовать объект nil.

...