¿Por qué la división de números enteros produce un número flotante en lugar de otro número entero?
Considere esta división en Python 3:
>>> 2/2
1.0
¿Es esto lo que se pretende? Recuerdo fuertemente que regresaron versiones anteriores int/int = int
. ¿Qué tengo que hacer? ¿Hay un nuevo operador de división o siempre debo lanzar?
En 2.x, el comportamiento se invirtió; ver ¿Cómo puedo forzar que la división sea de punto flotante? ¿La división sigue redondeando hacia abajo a 0? por el contrario, problema específico de 2.x.
Eche un vistazo a PEP-238 : Cambio del operador de división
El operador // estará disponible para solicitar la división del piso de manera inequívoca.
Vaya, lo encontré de inmediato 2//2
. Esto generará un int en lugar de un float.
Comportamiento del operador de división en Python 2.7 y Python 3
En Python 2.7: de forma predeterminada, el operador de división devolverá una salida entera.
Para obtener el resultado doble, multiplica el dividendo o divisor por 1,0.
100/35 => 2 # Expected is 2.857142857142857
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857
En Python 3
// => used for integer output
/ => used for double output
100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0 # Floating-point result if the divisor or dividend is real
La respuesta aceptada ya menciona PEP 238 . Sólo quiero agregar un vistazo rápido detrás de escena para aquellos interesados en lo que está sucediendo sin leer el PEP completo.
Python asigna operadores como +
, y a funciones especiales, de modo que, por ejemplo, -
es equivalente a*
/
a + b
a.__add__(b)
Con respecto a la división en Python 2, de forma predeterminada solo existe /
a qué se asigna __div__
y el resultado depende de los tipos de entrada (por ejemplo int
, float
).
Python 2.2 introdujo la __future__
característica division
, que cambió la semántica de división de la siguiente manera (TL;DR de PEP 238):
/
mapas a__truediv__
los que se debe "devolver una aproximación razonable del resultado matemático de la división" (cita de PEP 238)//
mapas a__floordiv__
, que debería devolver el resultado de suelo de/
Con Python 3.0, los cambios de PEP 238 se convirtieron en el comportamiento predeterminado y ya no existe un método especial __div__
en el modelo de objetos de Python.
Si desea utilizar el mismo código en Python 2 y Python 3, utilice
from __future__ import division
y apégate a la semántica PEP 238 de /
y //
.