为什么1e400不是int?

时间:2016-03-18 18:50:12

标签: python floating-point int scientific-notation

为什么科学记数法中的数字始终被视为float,如何将字符串转换为' 1e400'到int(对于float来说太大了?)

>>>int('1e400') 
ValueError: invalid literal for int() with base 10: '1e400'
>>>int(float('1e400'))
OverflowError: cannot convert float infinity to integer

我知道,我可以创建一个类似的功能:

def strtoint(string):
  parts = string.split('e')
  if len(parts) == 1:
    return int(string)
  elif len(parts) == 2:
    if int(parts[1])<0:
      return int(string)
    return int(parts[0])*10**int(parts[1])
  else:
    return int(string) #raise a error if the string is invalid, but if the variable string is not a string, it may have other way to convert to an `int`

但这不是一种非常pythonic的方式,有更好的方法吗?

1 个答案:

答案 0 :(得分:10)

也许您可以在转换为int之前使用Decimal作为中间类型。

>>> import decimal
>>> decimal.Decimal("1e400")
Decimal('1E+400')
>>> int(decimal.Decimal("1e400"))
10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0