2016-03-18 36 views
5

Perché un numero in notazione scientifica viene sempre letto come float e come posso convertire una stringa come "1e400" in(che è troppo grande per un float)?perché 1e400 non è un int?

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

lo so, posso fare una funzione come:

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` 

Ma questo non è un modo molto divinatorio, c'è un modo migliore?

+0

Possibile duplicato di http://stackoverflow.com/questions/32861429/converting-number-in-scientific-notation-to-int? – snakecharmerb

+1

@snakecharmerb le risposte a questa domanda presuppongono tutte che il numero sia compreso nell'intervallo di un 'float', mentre questa domanda dice esplicitamente che non lo è. –

+0

Per quanto riguarda il motivo per cui la notazione 'e' viene sempre considerata come una variabile, solo perché la sintassi è definita in questo modo. Niente che puoi fare per cambiarlo. –

risposta

8

Forse è possibile utilizzare Decimal come tipo intermedio prima di convertire in int.

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