Python:错误34:整数溢出(初学者)

时间:2018-07-20 13:31:44

标签: python python-3.x integer overflow integer-overflow

我必须在程序中处理非常大的整数,但是出现以下错误:

    Traceback (most recent call last):
  File "[path]", line n, in <module>
    number = int(numbers[0]*(10**numbers[1]))
OverflowError: (34, 'Numerical result out of range')

对于number = int(n),当我输入8e10000000作为n时。

有没有办法解决这个问题? 预先感谢。

3 个答案:

答案 0 :(得分:1)

数字8e10000000不是整数,它是Python的浮点数。使用e表示法的任何数字都被视为浮点数。 Python使用(通常)64位浮点格式,并且不能容纳这么大的数字。

所以问题不在于整数,而是您开始使用的浮点数。错误不在number = int(n)行,而是在n = 8e10000000行或您使用的任何等效项上。

您可以通过使用

来避免该错误
n = 8 * 10**10000000

这将导致一个整数。但是要小心-在RAM中构建整数需要大量时间和内存。 (我的系统执行该命令花费了19秒的时间。)如果尝试打印该值,计算机将花费很长的时间和大量的内存来构建字符串值,被打印。

最后,正如其他人所指出的那样,您声明的该声明与错误消息不匹配。因此有可能发生其他情况。如果您想关闭我们,请显示显示该错误的完整代码段。

答案 1 :(得分:0)

8e10000000的数字很大,Python表示为浮点数。
CPython通常将此浮点数存储为64位大小,对于这么大的数字而言,它太小了。

对于如此大的数目,可以安全使用Decimal模块:

import sys
from decimal import Decimal

print('max size = ', sys.maxsize)
number = Decimal("8e10000000")
print(number)

输出:

max size =  9223372036854775807
8E+10000000

数字9223372036854775807恰好是2 ^ 63-1。

答案 2 :(得分:0)

您遇到的问题是python是强类型,而且是动态类型。 8e10000000实际上是python(和C)类型issueLst = ['lesson learnt','other issues','risk event'] statusLst = ['Open','Open - Actions Completed'] df1 = df1.loc[df1['Issue Type'].isin(issueLst) & df1.loc[df1['Status'].isin(statusLst] ,是双精度浮点二进制表示形式的有效值,而python float的最大有效值是9,223,372,036,854,775,807(以{{ 1}})。

因此,python有一个int库,其中包含一个类sys.maxint documentation here的类,该类可以执行任意精度的数字。它不会像内存或速度效率那样高,但会绕开浮点数所具有的大小限制和精度问题,尤其是在处理金钱时。

如果您确实在使用中间值,则可以考虑的另一种选择是使用decimal将变量转换为python 2.5+中的任意大整数(在python 3.0+中,decimal.Decimal是一个long(n))是指向PEP 237的链接。