菜鸟教程小白 发表于 2022-12-12 10:06:22

ios - 与 NSNumber 不一致的值进行双倍乘法


                                            <p><p>我目前正在将 <code>NSString</code> 值解析为 <code>NSNumbers</code>,然后将它们添加到一个名为“data”的对象中称为操作数的 <code>NSMutableArray</code> 中,例如所以:</p>

<pre><code>NSNumberFormatter * f = [ init];
;
NSNumber * myNumber = ;
;
</code></pre>

<p>然后我检索这些数字,对它们进行一些数学运算,然后更新数组:</p>

<pre><code>double x = [doubleValue];
double y = [doubleValue];
double answer = x * y;
];
</code></pre>

<p>当我得到答案时,一切看起来都很好,例如:( 3.33 * 5 = 16.65)</p>

<p>但是,当我查看调试器时,我看到 x 和 answer 的一些疯狂值,例如:</p>

<p>x = 3.3300000000000001<br/>
答案 = 16.649999999999999</p>

<p>为什么会这样?我在解析这些来回和第四个时会失去一些精度吗?是我使用 <code>NSNumberFormatter</code> 解析字符串的方式吗?</p>

<p>我遇到问题的原因是因为我试图确保没有双重溢出错误,所以我使用这个简单的测试来检查完整性:</p>

<pre><code>    if (answer / y != x){
      //THROW OVERFLOW ERROR
    }
</code></pre>

<p>对于上述疯狂的数字,这总是不一致的。当我 <code>NSLog</code> 得到的答案很好:</p>

<pre><code>NSLog (@&#34;%g&#34;, [doubleValue]]);
</code></pre>

<p>同样</p>

<pre><code>NSLog (@&#34;%f&#34;, [doubleValue]]);
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您不会丢失任何需要担心的精度。这些是正确的值。只有大约 2^60 个不同的 double ,该有限集必须尝试近似覆盖 double 覆盖范围内的无限“数字数”。 </p>

<p>换句话说,在计算机领域和你的领域没有确切的答案</p>

<pre><code>   if (answer / y != x){
       //THROW OVERFLOW ERROR
   }
</code></pre>

<p>不会工作。或者它可能在大部分时间都有效,但如果你插入它就会失败。相反,您需要承认 double 的有限精度(相当高的精度):</p>

<pre><code>//Don&#39;t waste time worrying like this...
if (fabs(answer / y - x) &gt; 1e-12*fabs(answer)){
       //Not correct or useful thing to check don&#39;t use this - i did not check
   }


   // let the math package handle it:
   if (isnan(answer)){
   // we gots problems
   }

   if (!isnormal(answer)){
   // we gots some other problems
   }
</code></pre>

<p>别忘了 10^300 是一个非常大的数字, double 效果很好。要使用 32 位 float ,您需要更加注意执行顺序等。</p>

<p>NSLog 可能输出的小数精度较低,并且会四舍五入到最接近的值,因此答案看起来更好。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 与 NSNumber 不一致的值进行双倍乘法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23854885/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23854885/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 与 NSNumber 不一致的值进行双倍乘法