Python:错误34:整数溢出(初学者)[重复]

vcudknz3  于 2023-02-14  发布在  Python
关注(0)|答案(3)|浏览(208)
    • 此问题在此处已有答案**:

Why do I get "OverflowError: (34, 'Result too large')" or "OverflowError: (34, 'Numerical result out of range')" from floating-point exponentiation?(6个答案)
6小时前关门了。
我必须在程序中处理非常大的整数,但是我得到了以下错误:

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')

当我输入8e10000000作为n时。
有什么办法可以解决这个问题吗?先谢了。

4c8rllxm

4c8rllxm1#

数字8e10000000不是整数,对Python来说它是一个浮点数。任何使用e符号的数字都被视为浮点数。Python(通常)使用64位浮点格式,它不能容纳这么大的数字。
所以问题不在于整数,而在于你开始时的浮点数,错误不在number = int(n)行,它在n = 8e10000000行,或者你使用的任何等价的行。
您可以使用以下命令来避免该错误

n = 8 * 10**10000000

这将得到一个整数。但是要小心--在RAM中构建整数需要花费大量的时间和内存。(我的系统花了19秒来执行那个命令。)如果你试图打印那个值,计算机将花费 * 非常长的时间 * 和大量的内存来构建要打印的字符串值。
最后,正如其他人所指出的,您声明的语句与错误消息不匹配。因此,可能发生了其他事情。如果您希望我们关闭,请显示显示显示该错误的完整代码片段。

uwopmtnx

uwopmtnx2#

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。

xkrw2x1b

xkrw2x1b3#

您遇到的问题是python是 * 强类型 *,但也是 * 动态类型 *。8e10000000实际上属于python(和C)类型float,并且是双精度浮点二进制表示的有效值,而python int的最大有效值是9,223,372,036,854,775,807(在sys.maxint中找到)。
所以,python有一个decimal库,它有一个decimal.Decimaldocumentation here类,可以处理任意精度的数字,它不会像内存和速度一样高效,但是它绕过了浮点数的大小限制和精度问题,特别是在处理货币时。
如果你真的使用了int值,你可以考虑的另一个选择是在python 2.5+中使用long(n)将你的变量转换成一个任意大的整数(在python 3.0+中int是一个long)这里有一个PEP 237的链接。

相关问题