2015-09-30 18 views
6

Qualcuno potrebbe spiegare perché non è possibile utilizzare int() per convertire un numero intero rappresentato in notazione scientifica stringa in un python int?Conversione del numero in notazione scientifica in int

Per esempio, questo non funziona:

print int('1e1') 

Ma questo fa:

print int(float('1e1')) 

print int(1e1) # Works 

Perché int non riconosce la stringa come un numero intero? Sicuramente è semplice come controllare il segno dell'esponente?

+0

Per la stessa ragione per cui 'int()' non funziona, ad esempio, ''1.0'': è inteso per numeri interi. – TigerhawkT3

+0

Cosa pensi che succederebbe con 'int ('ciao mondo')'? Fallisce per la stessa identica ragione per cui 'int ('1e1')' fa - 'int()' analizza le stringhe intere, come si dice sulla latta. – TigerhawkT3

+0

'int ('1e1')' non funziona. 'float ('1e1')' funziona.Che cosa vi dice? – TigerhawkT3

risposta

2

Dietro le quinte una notazione numerica scientifica è sempre rappresentata come un galleggiante internamente. Il motivo è la gamma di numeri variabile in cui un intero si associa solo a un intervallo di valori fissi, diciamo valori 2^32. La rappresentazione scientifica è simile alla rappresentazione fluttuante con significativi ed esponenti. Ulteriori dettagli è possibile cercare in https://en.wikipedia.org/wiki/Floating_point.

Non è possibile trasmettere direttamente una rappresentazione di numero scientifico come stringa a numero intero.

print int(1e1) # Works 

funziona perché 1e1 come un numero è già un galleggiante.

>>> type(1e1) 
<type 'float'> 

Torna alla tua domanda: Vogliamo ottenere un numero intero da stringa mobile o scientifica. Dettagli: https://docs.python.org/2/reference/lexical_analysis.html#integers

>>> int("13.37") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '13.37' 

Per float o rappresentazioni scientifiche è necessario utilizzare la fase intermedia sopra float.

+0

Grazie, ha senso. – kezzos

+0

Lo fa? Personalmente, non penso che chiarisca la differenza tra i numeri rappresentati come stringhe e i numeri memorizzati come numeri, o gli argomenti validi per 'int()'. – TigerhawkT3

+0

@ TigerhawkT3 È simile a 'int ('13 .37 ')'. – wenzul

1

Perché in Python (almeno in 2.x poiché non utilizzo Python 3.x), int() si comporta in modo diverso su stringhe e valori numerici. Se si immette una stringa, quindi Python tenterà di analizzarlo basare 10 int

int ("077") 
>> 77 

Ma se si introduce un valore numerico valido, allora pitone lo interpreterà in base alla sua base e il tipo e convertirlo in base 10 Int.

int (077) # Leading 0 defines a base 8 number. 
>> 63 

Quindi, int('1e1') cercherà di analizzare 1e1 come una stringa di base 10 e getteranno ValueError. Ma 1e1 è un valore numerico (espressione matematica):

1e1 
>> 10.0 

Così int tratteremo come un valore numerico e gestirlo come se, convertendolo in float(10.0) e poi analizzarlo a int.

Pertanto, chiamando int() con un valore stringa, è necessario assicurarsi che la stringa sia un valore intero valido.

+1

Il fenomeno nella domanda (non è in grado di analizzare una stringa non intera con 'int()') in realtà non ha nulla a che fare con Python 2 vs 3 ... – TigerhawkT3

+0

Non ho usato Python 3 quindi non lo sono sicuro se questo comportamento è cambiato o meno. Risolto, grazie. – FallenAngel

+0

Perché il downvote? Per favore, spiegami in modo che possa spiegarlo o correggerlo. – FallenAngel

Problemi correlati