2016-03-18 8 views
5

Почему число в научной нотации всегда читается как float, и как я могу преобразовать строку типа «1e400» в int (что слишком велико для float)?Почему 1e400 не является int?

>>>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` 

, но это не очень вещий образом, есть лучший способ?

+0

Возможный дубликат http://stackoverflow.com/questions/32861429/converting-number-in-scientific-notation-to-int? – snakecharmerb

+1

@snakecharmerb ответы на этот вопрос все предполагают, что число находится в пределах диапазона 'float', в то время как этот вопрос явно говорит, что это не так. –

+0

Что касается того, почему 'e' обозначение всегда рассматривается как float, это просто потому, что синтаксис определен таким образом. Вы ничего не можете изменить, чтобы изменить его. –

ответ

8

Возможно, вы использовали бы Decimal в качестве промежуточного типа перед преобразованием в int.

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