2

で解析した後、浮動小数点値が変更されていJSONKitます。objectFromJSONStringまたはを呼び出した後に問題が発生しmutableObjectFromJSONStringます。

このメソッドが でトリガーされる前の JSON 応答は問題ありませんJSONKit.m

static id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection)

元の応答:

"value":"1002.65"

呼び出し後の応答objectFromJSONString:

"value":"1002.6500000001" or sometimes "value":"1002.649999999 "

ありがとう。

4

2 に答える 2

4

これは問題ではありません。

この値1002.65は、IEEE 754 浮動小数点数を使用して正確に表すことはできません。浮動小数点数は、printf形式変換指定子 %.17g を使用して 10 進数表現に変換されます。 

ドキュメントから:

C double プリミティブ型、または IEEE 754 Double 64 ビット浮動小数点は、浮動小数点の JSON Number 値を表すために使用されます。double として表すことができない (つまり、オーバーフローまたはアンダーフローが原因で) 浮動小数点数値を含む JSON は、解析に失敗し、オプションで NSError オブジェクトを返します。関数 strtod() は、変換を実行するために使用されます。JSON 標準では、無限大または NaN (非数) は許可されていないことに注意してください。浮動小数点値の変換と操作は簡単ではありません。残念ながら、RFC 4627 は、そのような詳細をどのように扱うべきかについて言及していません。浮動小数点値がラウンドトリップされたときに、同じテキスト表現を持っているか、比較しても等しいことに依存したり、期待したりしないでください。これは、JSONKit が JSON のパーサーとクリエーターの両方として使用されている場合でも当てはまります。

ソース: このスレッドを参照してください https://github.com/johnezang/JSONKit/issues/110

解決策: float を文字列に変換して出力するときに、精度を指定できます。NSNumberFormatterがより良い選択になるか、前の回答のようないくつかの printf ソリューションを使用します。

于 2013-04-22T11:42:40.427 に答える