JSONKit在从iphone中的webservice解码JSON对象时更改浮点值

时间:2013-04-22 11:28:51

标签: iphone ios objective-c json jsonkit

使用JSONKit解析后,浮点值会发生变化。调用objectFromJSONStringmutableObjectFromJSONString后会出现此问题。

JSONKit.m

中触发此方法之前,JSON响应正常
static id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection)

原始回复:

"value":"1002.65"

致电objectFromJSONString后的回复:

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

感谢。

2 个答案:

答案 0 :(得分:4)

这不是问题。

使用IEEE 754浮点数无法准确表示值1002.65。 使用printf格式转换说明符%。17g将浮点数转换为十进制表示形式。

来自Docs

  

C double基本类型,或IEEE 754 Double 64位浮点,   用于表示浮点JSON数值。 JSON那个   包含不能表示为的浮点数值   double(即由于over或underflow)将无法解析和   可选地返回NSError对象。函数strtod()用于   执行转换。请注意,JSON标准不允许   无穷大或NaN(非数字)。转换和操纵   浮点值非常重要。不幸的是,RFC 4627是   没有说明应该如何处理这些细节。你不应该依赖   或者期望当一个浮点值往返时它   会有相同的文字表示,甚至比较平等。这个   即使JSONKit同时用作解析器和创建者,也是如此   JSON,更不用说在不同系统之间传输JSON了   和实现。

来源:请参阅此帖子https://github.com/johnezang/JSONKit/issues/110

解决方案:您可以指定精度,同时将float转换为字符串以进行输出。 NSNumberFormatter将是一个更好的选择或使用一些printf解决方案,如上一个答案。

答案 1 :(得分:0)

使用浮动定点表示,如

 NSLog(@"value = %.2f",floatvalue); 

现在它将显示值= 1002.65