私のアプリケーションでは、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 のような言語では、そのようなことが見つかるとは思っていませんでした。めちゃくちゃ。誰かがその問題について良い説明をしていますか?