确定NSNumber是否为NaN

时间:2009-04-05 18:24:28

标签: cocoa nsnumber

如何确定Cocoa NSNumber是否代表NaN(不是数字)?

例如,当我解析具有无效(非数字)内容的字符串时,会出现这种情况。

9 个答案:

答案 0 :(得分:64)

所以,我发现类属性[NSDecimalNumber notANumber]就是为了这个目的。在某些语言中,NaN!= NaN,但在Cocoa中并非如此。

答案 1 :(得分:16)

正如Mike Abdullah所说,在Cocoa中表示NaN的自然方式是nil,但[NSNumber numberWithDouble:NAN]确实返回了一个有效的对象。没有NSNumber特定的方法可以检测到这一点,但通用方法isnan([foo doubleValue])可以正常工作。如果您不喜欢功能,可以将其粘贴在一个类别中。

答案 2 :(得分:12)

小数,至少:

[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]

答案 3 :(得分:10)

要确定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"

答案 4 :(得分:8)

我发现这有效,但是合法吗?

NSNumber *NaN = [NSDecimalNumber notANumber];

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

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

NaN保证是singleton常量值吗?会很酷,但我认为不是,因为我找到的所有例子都使用isEqual方法。

答案 5 :(得分:5)

我今天也找到了函数isnan()。

答案 6 :(得分:2)

我们也可以使用math.h中定义的#define作为follws

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

}

答案 7 :(得分:0)

任何带NaN的布尔表达式总是返回false。但这有什么用呢?

我从locationInView回来了Nan:在iPhone应用程序中处理一些手势。并且非常高兴地发现任何带NaN的布尔表达式总是返回false。我把它用于下面的谎言:

//我正在使用UIPanGestureRecognizer,似乎在TouchUp上我会得到/位置.x - .y - 很合理,因为在这种情况下触摸的结束没有位置。

CGPoint location = [gestureRecognizer locationInView:self];

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

那么只要.x和.y或合法的浮动值,当然它们永远不会等于自己的价值。但在.x或.y为NaN的情况下,比较将为假。 我可以安全地避免使用Nan进行计算。

答案 8 :(得分:-2)

NSNumber确实没有这样的对象,因为如果它不是数字,那么,它不是NSNumber。使用nil对象代表这种情况更为常见。