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

Posted

技术标签:

【中文标题】JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值【英文标题】:JSONKit changing float values on decoding JSON object from webservice in iphone 【发布时间】:2013-04-22 11:28:51 【问题描述】:

使用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 "

谢谢。

【问题讨论】:

A float 不能准确地表示数字 1002.65。 【参考方案1】:

这不是问题。

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

来自Docs:

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

来源:见此贴https://github.com/johnezang/JSONKit/issues/110

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

【讨论】:

【参考方案2】:

使用浮点定点表示,例如,

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

现在它将显示 value = 1002.65

【讨论】:

以上是关于JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值的主要内容,如果未能解决你的问题,请参考以下文章

适用于 iPhone 应用程序的 JSONKit?

如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?

使用 AFNetworking 或 JSONKit 与 Node.js express 网络服务器通信

发送到不可变对象的变异方法

在 iPhone 上解码 HTML 实体

BeautifulSoup 在从 utf-8 解码到 unicode 时遗漏了一些字母