菜鸟教程小白 发表于 2022-12-13 02:24:39

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


                                            <p><p>使用 <code>JSONKit</code> 解析后,浮点值会发生变化。调用 <code>objectFromJSONString</code> 或 <code>mutableObjectFromJSONString</code> 后出现问题。</p>

<p>在 <code>JSONKit.m</code> 中触发此方法之前,JSON 响应正常:</p>

<pre><code>static id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection)
</code></pre>

<p>原始回复:</p>

<pre><code>&#34;value&#34;:&#34;1002.65&#34;
</code></pre>

<p>调用<code>objectFromJSONString</code>后的响应:</p>

<pre><code>&#34;value&#34;:&#34;1002.6500000001&#34; or sometimes &#34;value&#34;:&#34;1002.649999999 &#34;
</code></pre>

<p>谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这不是问题。 </p>

<p><strong>值 <code>1002.65</code> 无法使用 IEEE 754float 精确表示</strong>。
使用 <a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/printf.3.html" rel="noreferrer noopener nofollow">printf</a> 将 float 转换为十进制表示。格式转换说明符 %.17g。 </p>

<p>来自 <a href="https://github.com/johnezang/JSONKit" rel="noreferrer noopener nofollow">Docs</a> :</p>

<blockquote>
<p>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.</p>
</blockquote>

<p>来源:查看此线程 <a href="https://github.com/johnezang/JSONKit/issues/110" rel="noreferrer noopener nofollow">https://github.com/johnezang/JSONKit/issues/110</a> </p>

<p>解决方案:您可以指定精度,同时将 float 转换为字符串进行输出。 <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumberFormatter_Class/Reference/Reference.html" rel="noreferrer noopener nofollow">NSNumberFormatter</a>将是一个更好的选择或使用一些 printf 解决方案,如上一个答案。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16146081/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16146081/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值