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
解析后,浮点值会发生变化。调用objectFromJSONString
或mutableObjectFromJSONString
后出现问题。
在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 "
谢谢。
【问题讨论】:
Afloat
不能准确地表示数字 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对象时更改浮点值的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?