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 esperaría que:
>>> (20-10) / (100-10)
0
La división de flotación tampoco funciona:
>>> float((20-10) / (100-10))
0.0
Si cualquiera de los lados de la división se lanza a flotación, funcionará:
>>> (20-10) / float((100-10))
0.1111111111111111
Cada lado en el primer ejemplo está evaluando como un int, lo que significa que la respuesta final se lanzará a un int. Como 0.111 es menor que .5, se redondea a 0. En mi opinión, no es transparente, pero supongo que así es.
¿Cuál es la explicación?
python
math
python-2.x
Adam Nelson
fuente
fuente
Respuestas:
Estás utilizando Python 2.x, donde las divisiones enteras se truncarán en lugar de convertirse en un número de coma flotante.
Deberías hacer uno de ellos un
float
:o
from __future__ import division
, que obliga/
a adoptar el comportamiento de Python 3.x que siempre devuelve un flotante.fuente
from __future__ import division
, puede obtener el antiguo comportamiento de división de estilo C mediante el uso de dos barras diagonales (por ejemplo,1 // 2
dará como resultado 0). Vea Pep 238 Cambiando el operador de la división__future__
. En Python 2 y 3 se//
hace referencia__floordiv__()
por defecto.Estás poniendo números enteros para que Python te devuelva un número entero :
Si después de lanzar esto a un flotante, el redondeo ya se habrá realizado, en otras palabras, 0 entero siempre será 0 flotante.
Si usa flotadores a ambos lados de la división, Python le dará la respuesta que espera.
Entonces en tu caso:
fuente
Necesitas cambiarlo a flotador ANTES de hacer la división. Es decir:
fuente
En Python 2.7, el
/
operador es una división entera si las entradas son enteras:En Python 3.3, el
/
operador es una división flotante incluso si las entradas son enteras.Para la división de enteros en Python 3, utilizaremos el
//
operador.El
//
operador es un operador de división entera en Python 2.7 y Python 3.3.En Python 2.7 y Python 3.3:
Ahora, mira la comparación
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, solo porque
/
es una división flotante.fuente
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 juega un papel cuando escribe.
Ejemplo: dado que esta es una pregunta que siempre aparece en mi cabeza cuando estoy haciendo operaciones aritméticas (si debo convertir a flotante y qué número), se presenta un ejemplo de ese aspecto:
Cuando dividimos enteros, no sorprende que se redondee más bajo.
Si escribimos el último número entero para flotar, todavía obtendremos cero, ya que para cuando nuestro número se divida entre el flotador ya se ha convertido en 0 debido a la división del entero.
El mismo escenario que el anterior pero desplazando el tipo de letra flotante un poco más cerca del lado izquierdo.
Finalmente, cuando escribimos el primer número entero para flotar, el resultado es el deseado, ya que comenzando desde la primera división, es decir, la más a la izquierda, usamos flotantes.
Extra 1: Si está tratando de responder eso para mejorar la evaluación aritmética, debe verificar esto
Extra 2: Tenga cuidado con el siguiente escenario:
fuente
Especificar un flotador colocando un '.' después de que el número también hará que flote por defecto.
fuente
Haga que al menos uno de ellos flote, entonces será división de flotación, no entero:
Lanzar el resultado para flotar es demasiado tarde.
fuente
En python
cv2
no se actualiza el cálculo de división. Por lo tanto, debe incluirfrom __future__ import division
en la primera línea del programa.fuente
De cualquier manera, es una división entera. 10/90 = 0. En el segundo caso, simplemente estás lanzando 0 a un flotador.
Intenta lanzar uno de los operandos de "/" para que sea flotante:
fuente
Estás lanzando para flotar después de que la división ya haya sucedido en tu segundo ejemplo. Prueba esto:
fuente
Estoy algo sorprendido de que nadie haya mencionado que el póster original podría haber querido que resultaran números racionales . Si está interesado en esto, el programa basado en Python Sage le respalda . (Actualmente todavía se basa en Python 2.x, aunque 3.x está en marcha).
Esta no es una solución para todos, ya que hace algunos preparativos, por lo que estos números no son
int
s, sinoInteger
elementos de clase Sage . Aún así, vale la pena mencionarlo como parte del ecosistema Python.fuente
Personalmente, preferí insertar un
1. *
al principio. Entonces la expresión se convierte en algo así:Como siempre hago una división para alguna fórmula como:
así que es imposible simplemente agregar un me
.0
gusta20.0
. Y en mi caso, envolverlo con unfloat()
puede perder un poco de legibilidad.fuente