Conversión de número en notación científica a int.

¿Alguien podría explicar por qué no puedo usar int() para convertir un número entero representado en notación científica de cadena en un python int ?

Por ejemplo, esto no funciona:

 print int('1e1') 

Pero esto hace:

 print int(float('1e1')) print int(1e1) # Works 

¿Por qué int no reconoce la cadena como un entero? ¿Seguro que es tan simple como comprobar el signo del exponente?

Detrás de las escenas, una notación científica numérica siempre se representa como un flotador interno. La razón es el rango de número variable, ya que un entero solo se asigna a un rango de valor fijo, digamos 2^32 valores. La representación científica es similar a la representación flotante con significante y exponente. Más detalles que puedes buscar en https://en.wikipedia.org/wiki/Floating_point .

No se puede convertir una representación numérica científica como una cadena a un entero directamente.

 print int(1e1) # Works 

Funciona porque 1e1 como número ya es un flotador.

 >>> type(1e1)  

Volviendo a su pregunta: queremos obtener un número entero de una cadena científica o flotante. Detalles: https://docs.python.org/2/reference/lexical_analysis.html#integers

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

Para las representaciones flotantes o científicas, debe utilizar el paso intermedio sobre la float .

Porque en Python (al menos en 2.x, ya que no uso Python 3.x), int() comporta de manera diferente en cadenas y valores numéricos. Si ingresa una cadena, entonces Python intentará analizarla a base 10 int

 int ("077") >> 77 

Pero si ingresa un valor numérico válido, entonces Python lo interpretará según su base y tipo y lo convertirá a base 10 int. luego python primero interperetará 077 como base 8 y lo convertirá a base 10, luego int() lo mostrará.

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

Por lo tanto, int('1e1') intentará analizar 1e1 como una cadena base 10 y lanzará ValueError . Pero 1e1 es un valor numérico (expresión matemática):

 1e1 >> 10.0 

Así que int lo manejará como un valor numérico y lo manejará como si lo hiciera, convirtiéndolo en float(10.0) y luego lo analice en int. Entonces, Python interpretará primero 1e1 ya que era un valor numérico y evaluará 10.0 y int() lo convertirá en entero.

Por lo tanto, al llamar a int() con un valor de cadena, debe asegurarse de que la cadena sea un valor entero de base 10 válido.