2010-01-07 8 views
7
La

// operador de "división entera" de Python me sorprendió, hoy en día:División entera en comparación con el cociente de piso: ¿por qué este sorprendente resultado?

>>> math.floor(11/1.1) 
10.0 
>>> 11//1.1 
9.0 

El documentation lee "(solado) cociente de X e Y". Entonces, ¿por qué math.floor (11/1.1) es igual a 10, pero 11 // 1.1 es igual a 9?

+5

http://mail.python.org/pipermail/python-dev/2007-January/070707.html – miku

+0

La pregunta canónica para la diferencia de división Python 2-vs-3 es [¿Cómo puedo forzar a la división a ser punto flotante? en Python? La división sigue redondeando a 0] (https://stackoverflow.com/questions/1267869/how-can-i-force-division-to-be-floating-point-in-python-division-keeps-rounding) – smci

Respuesta

5

Porque 1.1 no se puede representar en forma binaria exactamente; la aproximación es un poco más alta que 1.1, por lo tanto, el resultado de la división es un poco demasiado pequeño.

intente lo siguiente:

Bajo Python 2, el tipo en la consola:

>>> 1.1 
1.1000000000000001 

En Python 3.1, la consola mostrará 1.1, pero internamente, sigue siendo el mismo número.

Pero:

>>> 11/1.1 
10.0 

Como gnibbler señala, esto es el resultado de "redondeo interno" dentro de los límites de precisión disponibles de flotadores. Y como The MYYN señala en su comentario, // usa un algoritmo diferente para calcular el resultado de división de piso que math.floor() para preservar a == (a//b)*b + a%b de la mejor manera posible.

Utilice el tipo Decimal si necesita esta precisión.

+0

Pero de acuerdo con Python '11.0/1.1 == 10.0' es verdadero – sth

+1

Como sabemos 1.1 se almacena como 1.1000000000000001, por lo que el resultado 11.0/1.1 en Python es 9.999999999999999090909090909 pero el float más cercano a este número es de hecho 10.0, por lo que sucede que el resultado es exactamente 10.0 –

+0

@Tim. Pensé en eso, y creo que esta es la clave de la diferencia entre math.floor (11/1.1) y 11 // 1.1. Sin embargo, como señaló gnibbler, el hecho de que 1.1 esté representado por un número ligeramente mayor solo indica que math.floor (11/1.1) debería ser realmente 9.0, lo que deja la pregunta original abierta. – EOL

Cuestiones relacionadas