擅长:python、mysql、java
<p><code>fmin</code>是将长整数除以浮点数后的<code>float</code>。它的值是<code>1.84952718165824e+305</code>。再加上1根本不会改变它,精度根本没有那么高。</p>
<p>如果改为整数除法,<code>fmin</code>将保持为<code>long</code>:</p>
<pre><code>>>> fmin = N / f2
>>> fmin
18495271816582402193321106509793602189617847415669131056768139225220221855498293
49983070478076000952025038039460539798061570960870927236986153971731443029057201
52035339202255934728764897424408896865977423536890485615063959262845076766281553
766072964756078264853041334880929452289298495368916583660903481130L
>>> N - (fmin * f2)
111L
</code></pre>
<p>当然,您不会得到<code>0</code>,因为结果的小数部分在整数除法中被丢弃。
但现在,添加1<em>将产生不同的效果:</p>
<pre><code>>>> N - ((fmin+1) * f2)
-365L
</code></pre>
<p>使用<code>Decimal</code>模块不会改变问题:</p>
<pre><code>>>> from decimal import Decimal, getcontext
>>> fmin = Decimal(N) / Decimal(f2)
>>> fmin
Decimal('1.849527181658240219332110651E+305')
</code></pre>
<p>仍然没有无限精度,即使设置了<code>Decimal.getcontext().prec = 2000</code>,也不会得到精确的0。</p>