4

私のアプリケーションでは、json を使用して通信する外部 API を使用しています。今日、フロートと NSNumbers の間で奇妙な動作に遭遇しました (iOS の経験が浅いため、奇妙かもしれません)。問題は、API 応答でフロートを受け取っていることです。この特定のケースでは、135.99 です。ネイティブの obj-c json パーサーが応答を解析すると、その値で NSNumber が作成されます。それは完璧に機能します。しかし、この API を使い始めたとき、ネイティブの json パーサーがどのように動作するかを知らなかったので、次のようなことをしていました。

NSNumber * number = [NSNumber numberWithFloat:[[response objectForKey:@"Number"] floatValue]];

したがって、上記で実際に起こっていることは、実際には NSNumber を float にキャストし、その float で新しい NSNumber を作成することです。そして、それについて何がそんなに奇妙ですか?(私にとって)奇妙なのは、上記の行が適切な値である 135.99 ではなく 135.99001 の値で NSNumber を生成することです。

特に PHP のような言語 (0.2 + 0.7 は 0.9 に等しくない) では、浮動小数点演算が本当にめちゃくちゃであることは知っていますが、C 言語のスーパーセットである Objective-C のような言語では、そのようなことが見つかるとは思っていませんでした。めちゃくちゃ。誰かがその問題について良い説明をしていますか?

4

3 に答える 3

-1

フロートでは奇妙なことが起こります。それらが不正確であることは、それらの性質の一部です。

それに加えて、float から新しい NSNumber オブジェクトを作成するためだけに (型キャストだけでなく) 素敵な NSNumber を float に変換する理由を完全には理解していません。それらが異なるべきである何らかの理由で。つまり、float の比較に関しては、決して比較してはなりませんfloat1 == float2。より良い比較abs(float1-float2) < 0.001、またはこれまでの重要性が重要です。

フロートのこれらの動作に関するいくつかの一般的なことは、このサイトでよく説明されています: http://floating-point-gui.de/

于 2013-02-14T09:41:36.640 に答える