当前位置:  开发笔记 > IOS > 正文

确定NSNumber是否为NaN

如何解决《确定NSNumber是否为NaN》经验,为你挑选了6个好方法。

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

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



1> Adam Ernst..:

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


为了清楚起见,要测试NSNumber是否为NaN,那么代码将是:`[NSNumber isEqualToNumber:[NSDecimalNumber notANumber]]`.如果NSNumber是NaN,则返回YES.

2> Jens Ayton..:

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



3> Peter DeWees..:

对于小数,至少:

[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]



4> Jakob Egger..:

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



5> 小智..:

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

NSNumber *NaN = [NSDecimalNumber notANumber];

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

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

NaNguaranteeed是一个singleton恒定值?会很酷,但我想它不是,因为我找到的所有例子都使用这些isEqual方法.



6> Johnny Mast..:

还有函数isnan()我今天发现它.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有