OGeek|极客世界-中国程序员成长平台

标题: iphone - JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 02:24
标题: iphone - JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值

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

谢谢。



Best Answer-推荐答案


这不是问题。

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

来自 Docs :

The C double primitive type, or IEEE 754 Double 64-bit floating-point, is used to represent floating-point JSON Number values. JSON that contains floating-point Number values that can not be represented as a double (i.e., due to over or underflow) will fail to parse and optionally return a NSError object. The function strtod() is used to perform the conversion. Note that the JSON standard does not allow for infinities or NaN (Not a Number). The conversion and manipulation of floating-point values is non-trivial. Unfortunately, RFC 4627 is silent on how such details should be handled. You should not depend on or expect that when a floating-point value is round tripped that it will have the same textual representation or even compare equal. This is true even when JSONKit is used as both the parser and creator of the JSON, let alone when transferring JSON between different systems and implementations.

来源:查看此线程 https://github.com/johnezang/JSONKit/issues/110

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

关于iphone - JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16146081/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4