52

NSNumberCocoaが NaN (数値ではない) を表しているかどうかを判断するにはどうすればよいですか?

これは、たとえば、無効な (数値以外の) 内容を含む文字列を解析すると発生します。

4

9 に答える 9

73

[NSDecimalNumber notANumber]それで、クラスプロパティはこの目的のためだけのものであることがわかりました。一部の言語では NaN != NaN ですが、Cocoa ではそうではありません。

于 2009-04-05T18:33:58.150 に答える
19

Mike Abdullah が言うように、Cocoa で NaN を表現する自然な方法は withですnil[NSNumber numberWithDouble:NAN]、有効なオブジェクトを返します。NSNumberこれを検出する固有の方法はありませんが、一般的な方法でisnan([foo doubleValue])ある が機能します。機能が気に入らない場合は、カテゴリに貼り付けることができます。

于 2009-04-06T22:15:20.997 に答える
15

小数の場合、少なくとも:

[[NSDecimalNumber notANumber] isEqualToNumber:myNumber]
于 2011-06-29T15:13:55.107 に答える
12

NSNumberがNaNであるかどうかを判断するには、NSNumberを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"
于 2012-11-15T19:01:48.857 に答える
10

これが機能することがわかりましたが、合法ですか?

NSNumber *NaN = [NSDecimalNumber notANumber];

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

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

定値であることがNaN保証されていますか? singletonクールだと思いますが、私が見つけたすべての例はisEqualメソッドを使用しているため、そうではないと思います。

于 2012-08-03T20:22:05.883 に答える
5

今日見つけた isnan() 関数もあります。

于 2010-01-21T18:21:26.560 に答える
3

次のように、math.h で定義された #define を使用することもできます。

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

}

于 2014-08-04T07:20:11.200 に答える
0

NaN を含むブール式は常に false を返します。しかし、それはどのように役立ちますか?

私は locationInView: から Nan を取得していましたが、iPhone アプリでいくつかのジェスチャーを処理していました。そして、NaN を含むブール式は常に false を返すことがわかり、とてもうれしく思いました。私はこれを以下のように使用します:

//私は を使用していましたUIPanGestureRecognizerが、TouchUp では /location .x - .y に対して Nan を取得するようです。この場合、タッチの最後には場所がないため、かなり妥当です。

CGPoint location = [gestureRecognizer locationInView:self];

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

したがって、長い .x および .y または正当な float 値である限り、もちろん、それらが独自の値と等しくなることはありません。ただし、.x または .y が NaN の場合、比較は false になります。そして、Nan を使用した計算を安全に回避できます。

于 2010-10-25T19:08:37.917 に答える
-3

NSNumber が数値でない場合、NSNumber ではないため、実際にはそのようなオブジェクトはありません。これを表すために nil オブジェクトを使用する方がより一般的です。

于 2009-04-06T12:37:31.337 に答える