擅长:python、mysql、java
<p>Python有任意精度的整数,但有标准的有限(双)精度浮点。在python3中,两个整数除以<code>/</code>产生一个浮点,这意味着</p>
<pre><code>>>> 10**50/10**25
1e+25
>>> int(10**50/10**25)
10000000000000000905969664
</code></pre>
<p>但是如果我们纯粹使用<code>//</code>处理整数,我们会得到:</p>
<pre><code>>>> 10**50//10**25
10000000000000000000000000
</code></pre>
<p>在您的代码中,<code>(n-1)/3</code>和<code>(n/2)</code>都将产生浮点输出,这意味着您只有大约18位精度。如果我们将你的函数修改为纯整数:</p>
<pre><code>def sumof3b(n):
n = (n-1)//3
return (6+3*(n-1))*n//2
</code></pre>
<p>然后我们得到低值的一致性:</p>
<pre><code>>>> all(sumof3(n) == sumof3b(n) for n in range(10**7))
True
</code></pre>
<p>但在高值时,我们保持精度:</p>
<pre><code>>>> n = 232471924
>>> sumof3(n) # bad
9007199280122284
>>> sumof3b(n) # good
9007199280122283
</code></pre>
<p>[这里我们可以重新排序以确保不会丢失任何分数数据,但有时我发现<a href="https://docs.python.org/2/library/fractions.html" rel="nofollow">^{<cd5>}</a>模块也很方便。]</p>