我在项目中使用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或类似的东西。
为什么会这样?我怎么能阻止这个? 感谢
答案 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
来获得更高的精度(以较低的范围数字为代价)。