<p>如果可以的话,不要使用浮点值;它们很难推理,会咬你的</p>
<p>每当你尝试使用浮点,特别是那些有大量数字的浮点时,你应该考虑如何将它转换成整数范围,如果你的值的浮动部分超出了/P>>的无效或不必要的精度。
<ul>
<li>可能是一个更大的<code>int</code>,如<code>10**400</code>或<code>10**100000</code>,这应该为浮点数字提供足够的空间,同时允许您在整数空间中工作</li>
<li>直接转换或缩小比例,丢弃小数点以外的数字(考虑测量的准确度)</li>
</ul>
<pre class="lang-py prettyprint-override"><code>>>> int(1.0 * 10) * 10**999 # divide off 10**690 later or note in units
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> int(1.0 * 10**10) # multiply by 10**300 later or note in units
10000000000
</code></pre>
<p>实际上,这就是为什么你需要科学记数法——如果你不需要的话,不要存储数据及其所有数字,保留你需要的最小数量和第二个乘数作为大小因子(科学记数法确实使用浮点,但对于整数的想法是一样的)</p>
<p>然后,您可以在完成数学运算(甚至将它们单独相乘)后回忆起乘法器,而不是使用浮点运算</p>
<p>甚至可以以某种常规方式完全删除大部分数字,并在使用数据的人或任何人的后计算单位中显示系数</p>
<hr/>
<p>虽然这个问题是关于大数字的,但不幸的是,即使是<code>decimal.Decimal</code>也不能像人们所期望的那样处理小的浮点位,因为它们在存储方式上存在一些别名</p>
<p><a href="https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers</a></p>
<p>这对于普通的python浮动是有问题的,因此扩展到了<code>Decimal</code>,甚至是您在正常使用中可能看到的大小</p>
<pre class="lang-py prettyprint-override"><code>>>> 9007199254740993.0
9007199254740992.0
>>> Decimal(9007199254740993.0) # NOTE converted to float before Decimal
Decimal('9007199254740992')
</code></pre>
<p>改编自<a href="https://stackoverflow.com/questions/3793838/which-is-the-first-integer-that-an-ieee-754-float-is-incapable-of-representing">Which is the first integer that an IEEE 754 float is incapable of representing exactly?</a></p>
<p>原问题的例子</p>
<pre class="lang-py prettyprint-override"><code>>>> a = Decimal(10**310) * Decimal(1.0)
>>> b = Decimal(1)
>>> a + b - a
Decimal('0E+283')
</code></pre>
<p>进一步的例子</p>
<pre class="lang-py prettyprint-override"><code>>>> a = Decimal(10**310)
>>> b = Decimal(0.1)
>>> a + b - a
Decimal('0')
>>> a
Decimal('10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
>>> b
Decimal('0.1000000000000000055511151231257827021181583404541015625')
</code></pre>
<pre class="lang-py prettyprint-override"><code>>>> 10**-100
1e-100
>>> Decimal(10**-100)
Decimal('1.00000000000000001999189980260288361964776078853415942018260300593659569925554346761767628861329298958274607481091185079852827053974965402226843604196126360835628314127871794272492894246908066589163059300043457860230145025079449986855914338755579873208034769049845635890960693359375E-100')
>>> 10**-1000
0.0
>>> Decimal(10**-1000)
Decimal('0')
</code></pre>