我必须在程序中处理非常大的整数,但是出现以下错误:
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时。
有没有办法解决这个问题? 预先感谢。
答案 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的链接。