0

プロジェクトで SBJSON を使用しており、辞書から json 文字列を作成しようとしています。

ここで何が起こっているのか、私はフロートを NSNumbers として辞書に入れています:

NSDictionary* tempdic = [[NSDictionary alloc] init];
tempdic = [NSDictionary dictionaryWithObjectsAndKeys:productId, @"productId", [NSNumber numberWithFloat:quantity], @"aantal", price, @"price" , nil];
        [orders addObject:tempdic];
NSDictionary* json = [NSDictionary dictionaryWithObjectsAndKeys: orders, @"order", message, @"message", [NSNumber numberWithFloat:orderprice], @"totalPrice",dueDate,@"dueDate", nil];

そして、最終的にjson文字列として記述するために、これら3つを試しました。

1)

NSData* jsonData = [writer dataWithObject:json];
NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

2)

NSString* jsonString = [json JSONRepresentation];

3)

NSString* jsonString = [writer stringWithObject:json];

これらはそれぞれ、0.95 を 0.95000000000000034355 に変更したり、さらに悪いことに 0.949999999999999992344 に変更したりします。

なぜこうなった?どうすればこれを防ぐことができますか? ありがとう

4

2 に答える 2

1

これが float 値の基本的な問題です。のべき乗の合計で表現できない値を格納することはできません2。したがって、浮動小数点のおおよその値が得られます。

たとえば、 ie 1.25のべき乗の合計として簡単に表すことができますが、 のべき乗の合計として表す場合、結果は次のようになります。2
1*2^0 +1*2^-21.3321*2^0 + 1*2^-2 + 1*2^-4 + 1*2^-8 + 1*2^-9 ....

wikiで Representable numbers, conversion and roundingを読んでください。また、オンライン ツールを使用し
て浮動小数点表現を確認できます。

于 2013-01-23T16:19:00.127 に答える
0

これは、浮動小数点数の典型的な問題です。ただし、より高い精度を取得するのではなく、を使用できます(NSDecimalNumber数値の範囲が狭くなります)。NSNumber

于 2013-01-24T10:00:44.567 に答える