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

问题描述 投票:-1回答:3

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

    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)when我输入8e10000000作为n。

有没有办法解决这个问题?提前致谢。

python python-3.x integer overflow integer-overflow
3个回答
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。


1
投票

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

所以问题不是整数,而是你开始的浮点数。错误不在number = int(n)行,它在n = 8e10000000行或你使用的等价物。

您可以通过使用来避免该错误

n = 8 * 10**10000000

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

最后,正如其他人所指出的那样,您声明的声明与错误消息不符。所以有可能正在发生其他事情。如果您想要我们关闭,请显示一个显示该错误的完整代码段。


0
投票

您遇到的问题是python强类型但动态类型的问题。 8e10000000实际上是python(和C)类型float,并且是双精度浮点二进制表示的有效值,而python int的最大有效值是9,223,372,036,854,775,807(与sys.maxint一起找到)。

因此,python有一个decimal库,它有一个类decimal.Decimal documentation here,可以执行任意精度数字。它不会像内存或速度效率那样,但它会绕过浮点数所具有的大小限制和精度问题,特别是在处理资金时。

如果你真正使用inter值,你可以考虑的另一个选择是使用long(n)将你的变量转换为python 2.5+中的任意大整数(在python 3.0+中intlong)这里是PEP 237的链接它。

© www.soinside.com 2019 - 2024. All rights reserved.