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 字符串,我尝试了这三个。

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

为什么会这样?我怎样才能防止这种情况?谢谢

4

2 回答 2

1

这是浮点值的基本问题。您不能存储不能用 的幂之和表示的值2。从而产生与您的浮点数的近似值。

eg1.25可以很容易地表示为2
ie 的幂的总和,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 上的可表示数字、转换和舍入即可。您可以使用在线工具
检查您的浮点表示。

于 2013-01-23T16:19:00.127 回答
0

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

于 2013-01-24T10:00:44.567 回答