font python math python-2.x

font - subplot title python



DivisiĆ³n de Python (11)

Estaba tratando de normalizar un conjunto de números de -100 a 0 a un rango de 10-100 y estaba teniendo problemas solo para notar que incluso sin ninguna variable, esto no evalúa la forma en que lo esperaría:

>>> (20-10) / (100-10) 0

La división de flotadores tampoco funciona:

>>> float((20-10) / (100-10)) 0.0

Si cualquiera de los lados de la división se convierte en un flotante funcionará:

>>> (20-10) / float((100-10)) 0.1111111111111111

Cada lado del primer ejemplo está evaluando como int, lo que significa que la respuesta final se convertirá en int. Como 0.111 es menor que .5, se redondea a 0. No es transparente en mi opinión, pero supongo que así es.

¿Cuál es la explicación?


De cualquier forma, es una división entera. 10/90 = 0. En el segundo caso, simplemente está lanzando 0 a un flotador.

Intente convertir uno de los operandos de "/" para que sea flotante:

float(20-10) / (100-10)


Debes cambiarlo a un flotador ANTES de hacer la división. Es decir:

float(20 - 10) / (100 - 10)


En Python 2.7, el operador / es una división entera si las entradas son números enteros:

>>>20/15 1 >>>20.0/15.0 1.33333333333 >>>20.0/15 1.33333333333

En Python 3.3, el operador / es una división flotante incluso si las entradas son enteros.

>>> 20/15 1.33333333333 >>>20.0/15 1.33333333333

Para la división de enteros en Python 3, usaremos el operador // .

El operador // es un operador de división de enteros en Python 2.7 y Python 3.3.

En Python 2.7 y Python 3.3:

>>>20//15 1

Ahora, mira la comparación

>>>a = 7.0/4.0 >>>b = 7/4 >>>print a == b

Para el programa anterior, la salida será False en Python 2.7 y True en Python 3.3.

En Python 2.7 a = 1.75 yb = 1.

En Python 3.3 a = 1.75 yb = 1.75, simplemente porque / es una división flotante.


Especificando un flotador colocando un ''.'' después del número también hará que flote por defecto.

>>> 1 / 2 0 >>> 1. / 2. 0.5


Está utilizando Python 2.x, donde las divisiones enteras se truncarán en lugar de convertirse en un número de punto flotante.

>>> 1 / 2 0

Deberías hacer que uno de ellos float :

>>> float(10 - 20) / (100 - 10) -0.1111111111111111

o from __future__ import division , que las fuerzas / adoptan el comportamiento de Python 3.x que siempre devuelve una flotación.

>>> from __future__ import division >>> (10 - 20) / (100 - 10) -0.1111111111111111


Estás poniendo enteros para que Python te devuelva un entero :

>>> 10 / 90 0

Si después de esto lo arrojas a un flotador, el redondeo ya habrá sido hecho, en otras palabras, 0 entero siempre se convertirá en 0 flotante.

Si usa flotadores en cualquier lado de la división, entonces Python le dará la respuesta que espera.

>>> 10 / 90.0 0.1111111111111111

Entonces en tu caso:

>>> float(20-10) / (100-10) 0.1111111111111111 >>> (20-10) / float(100-10) 0.1111111111111111


Estás lanzando a flotar después de que la división ya haya sucedido en tu segundo ejemplo. Prueba esto:

float(20-10) / float(100-10)


Estoy algo sorprendido de que nadie haya mencionado que al cartel original le hubiera gustado que los números racionales resultaran. Si está interesado en esto, el programa Sage basado en Python le da la espalda . (Actualmente todavía está basado en Python 2.x, aunque 3.x está en camino).

sage: (20-10) / (100-10) 1/9

Esta no es una solución para todos, porque hace un cierto preparsing así que estos números no son int s, sino elementos de la clase Sage Integer . Aún así, vale la pena mencionarlo como parte del ecosistema de Python.


Haga que al menos uno de ellos flote, luego será una división flotante, no entera:

>>> (20.0-10) / (100-10) 0.1111111111111111

Lanzar el resultado para flotar es demasiado tarde.


Personalmente, prefiero insertar un 1. * al principio. Entonces la expresión se convierte en algo como esto:

1. * (20-10) / (100-10)

Como siempre hago una división para alguna fórmula como:

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

por lo que es imposible simplemente agregar un .0 como 20.0 . Y en mi caso, envolver con un float() puede perder un poco de legibilidad.


Tiene que ver con la versión de python que usas. Básicamente adopta el comportamiento C: si divide dos enteros, los resultados se redondearán a un entero. También tenga en cuenta que Python realiza las operaciones de izquierda a derecha, lo que desempeña un papel cuando encasilla.

Ejemplo: Dado que esta es una pregunta que siempre aparece en mi cabeza cuando estoy haciendo operaciones aritméticas (debería convertir a flotación y qué número), se presenta un ejemplo de ese aspecto:

>>> a = 1/2/3/4/5/4/3 >>> a 0

Cuando dividimos números enteros, no sorprende que se redondee más bajo.

>>> a = 1/2/3/4/5/4/float(3) >>> a 0.0

Si enchufamos el último número entero para flotar, todavía obtendremos cero, ya que para cuando nuestro número se divide por el flotante ya se ha convertido en 0 debido a la división entera.

>>> a = 1/2/3/float(4)/5/4/3 >>> a 0.0

Mismo escenario que el anterior, pero cambiando el tipo de flotador un poco más cerca del lado izquierdo.

>>> a = float(1)/2/3/4/5/4/3 >>> a 0.0006944444444444445

Finalmente, cuando enchufamos el primer entero para flotar, el resultado es el deseado, ya que comenzando desde la primera división, es decir, el más a la izquierda, usamos flotadores.

Extra 1: Si está intentando responder eso para mejorar la evaluación aritmética, debe verificar this

Extra 2: Tenga cuidado con la siguiente situación:

>>> a = float(1/2/3/4/5/4/3) >>> a 0.0