写入NSString的NSDictionary中的SBJSON Float不正确

时间:2013-01-23 16:11:15

标签: ios nsstring nsdictionary sbjson

我在项目中使用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字符串,我尝试了这三个。

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或类似的东西。

为什么会这样?我怎么能阻止这个? 感谢

2 个答案:

答案 0 :(得分:1)

这是浮点值的基本问题。您无法存储无法用2的幂的总和表示的值。因此得到浮点的近似值。

e.g。 1.25可以很容易地表示为2的权力之和 即1*2^0 +1*2^-2,但如果您要将1.33表示为2的幂和,那么结果将是1*2^0 + 1*2^-2 + 1*2^-4 + 1*2^-8 + 1*2^-9 ....

请阅读wiki上的Representable numbers, conversion and rounding 您可以检查浮点表示using online tool

答案 1 :(得分:0)

这是浮点数的经典问题。但是,您可以使用NSDecimalNumber而不是NSNumber来获得更高的精度(以较低的范围数字为代价)。