La división de enteros de Python produce flotante

223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

¿Es esto intencionado? Recuerdo fuertemente que las versiones anteriores volvían int/int=int? ¿Qué debo hacer? ¿Hay un nuevo operador de división o siempre debo emitir?

Jonas Byström
fuente
31
Sí, así es como funciona la división en 3.x.
hughdbrown
2
Aquí hay una publicación del creador de Python que habla sobre cómo funciona el redondeo, es ortogonal a su pregunta, pero me pareció interesante: python-history.blogspot.com/2010/08/…
Aaron D
@hughdbrown, ¿eso significa esencialmente para todas las versiones de Python 3?
Charlie Parker
@hughdbrown: sí, PEP es final , lo que significa que tanto aceptado como implementado.
Jonas Byström

Respuestas:

285

Eche un vistazo a PEP-238 : Cambio del operador de división

El operador // estará disponible para solicitar la división de piso sin ambigüedades.

Brandon E Taylor
fuente
10
@JonathanSternberg a excepción de todo el código que se escribió para python 2.0. Siento que el rol de / y // debería revertirse para mantener la compatibilidad con versiones anteriores. Además, en casi todos los demás idiomas / tipos de reservas. Tendría más sentido que // para convertir automáticamente a flotante, no /.
thang
1
La segunda parte (después de "También") tiene sentido (similitud con otros lenguajes) pero con respecto a la primera parte, el objetivo de Python 3 era NO ser retrocompatible con Python 2, sino solucionar un montón de problemas con Python 2. Bastantes personas consideraron que la ambigüedad de /ser suficiente de un "error" de diseño de lenguaje que necesitaba ser reparado en Python 3. Puede haber sido una decisión controvertida, pero suficiente gente sintió que era la correcta. Cuenta conmigo en el grupo que ama el cambio. Es bueno que todos podamos estar de acuerdo en no estar de acuerdo. Salud. :)
Ray Toal
59

Vaya, encontrado de inmediato 2//2.

Jonas Byström
fuente
55
¿Podrías dar más detalles?
blueFast
44
El uso de esto generará un int, no un flotante @dangonfast.
Ashish Ahuja
Esto parece no funcionar para números negativos. -1 // 5 devuelve -1 y -5 // 5 devuelve -1.
mschuett
@mschuett: esto es de esperarse, y es el mismo resultado que con Python 2.
Jonas Byström
1
Sí, investigué un poco más y descubrí eso también. Sin embargo, me imagino que un número decente de personas no se da cuenta de esto dependiendo del idioma de donde provienen.
mschuett
45

Espero que pueda ayudar a alguien al instante.

Comportamiento del operador de división en Python 2.7 y Python 3

En Python 2.7: por defecto, el operador de división devolverá una salida entera.

para obtener el resultado en doble múltiplo 1.0 a "dividendo o divisor"

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 divsor or dividend real
VijayNaidu
fuente
1
Por cierto, no es necesario multiplicar por 1.0. Es suficiente que uno de los números sea flotante. Por ejemplo, 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy
21

La respuesta aceptada ya menciona PEP 238 . Solo quiero agregar un vistazo rápido detrás de escena para aquellos interesados ​​en lo que está sucediendo sin leer todo el PEP.

Python mapas de operadores como +, -, *y /para funciones especiales, como por ejemplo, que a + bes equivalente a

a.__add__(b)

Con respecto a la división en Python 2, solo hay de forma predeterminada /qué mapas __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 los __truediv__que debe "devolver una aproximación razonable del resultado matemático de la división" (cita de PEP 238)
  • //asigna a __floordiv__, que debería devolver el resultado de/

Con Python 3.0, los cambios de PEP 238 se convirtieron en el comportamiento predeterminado y no hay un método más especial __div__en el modelo de objetos de Python.

Si desea usar el mismo código en Python 2 y Python 3, use

from __future__ import division

y se adhieren a la semántica PEP 238 de /y //.

code_onkel
fuente
0

Según la documentación de Python3, python cuando se divide por entero, generará flotante a pesar de que se espera que sea entero.

Para imprimir exclusivamente enteros, use floor division method. La división del piso está redondeando a cero y eliminando el punto decimal.Represented by //

Por lo tanto, en lugar de 2/2, use 2//2

También puede importar la división __future__independientemente del uso de python2 o python3.

¡Espero eso ayude!

Aditi
fuente