¿Por qué la división de números enteros produce un número flotante en lugar de otro número entero?

Resuelto Jonas Byström asked hace 15 años • 4 respuestas

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.

Jonas Byström avatar Aug 16 '09 04:08 Jonas Byström
Aceptado

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.

Brandon E Taylor avatar Aug 15 '2009 21:08 Brandon E Taylor

Vaya, lo encontré de inmediato 2//2. Esto generará un int en lugar de un float.

Jonas Byström avatar Aug 15 '2009 21:08 Jonas Byström

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
VijayNaidu avatar Jul 02 '2017 06:07 VijayNaidu

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 //.

code_onkel avatar Sep 05 '2016 14:09 code_onkel