Recientemente he notado que int()
redondea un flotador hacia 0, mientras que la división entera redondea un flotador hacia su piso.
por ejemplo:
-7 // 2 = -4
int(-7/2) = -3
He leído la documentación que especifica:
clase int (x, base = 10)
Devuelve un objeto entero construido a partir de un número o cadena x, o devuelve 0 si no se dan argumentos>. Si x es un número, devuelve x. int (). Para números de coma flotante, esto se trunca hacia cero.
y:
división de piso
División matemática que redondea al entero más cercano. El operador de división de piso es //. Por ejemplo, la expresión 11 // 4 se evalúa como 2 en contraste con el 2,75 devuelto por la división verdadera flotante. Tenga en cuenta que (-11) // 4 es -3 porque es -2.75 redondeado hacia abajo. Ver PEP 238.
Pero me parece ilógico que 2 operaciones similares (división flotante a entero) deban devolver resultados diferentes.
¿Hay alguna motivación para las diferencias entre las funciones?
Gracias.
fuente
Respuestas:
Consistencia.
Tendrás que seguir algunas explicaciones muy básicas y aparentemente irrelevantes para entenderlo.
En la escuela has aprendido la división con un resto. Y has hecho cálculos como este:
Más tarde, has aprendido divisiones para números reales:
Hasta este punto, puede creer eso
x // 4
yint(x/4)
siempre dar el mismo resultado. Esa es su comprensión actual de la situación.Sin embargo, eche un vistazo a lo que sucede en la división de enteros: el número detrás de R cambia de 3, 2, 1 a 0 y luego se reinicia: 3, 2, 1, 0. El número frente a R disminuye cada 4to paso.
Entonces, ¿cómo continuará?
Al mismo tiempo, la división de números reales nos da:
Es por eso que
-1 // 4
da -1 peroint(-1/4)
da 0.Bueno, tienen diferentes propósitos:
//
es parte de un cálculo de enteros con restos yint()
le da la parte frente a la.
operación de un número real.Tú decides lo que quieres calcular, luego decides qué operador usar en Python para obtener el resultado correcto.
Buena pregunta. Sigue aprendiendo.
fuente
//
operador en python 3 es evitar el uso de int (float). Si este no es el caso, ¿cuándo debería elegir implementar usandoint()
y cuándo debo implementar usando//
Math.Floor(3.23) != -Math.Floor(-3.23)
por la misma razón-((-x)//y)
no tiene por qué ser igualx//y
.Diría que se espera su observación de que esas 2 operaciones deberían ser intuitivamente similares ya que en números positivos se comportan de manera idéntica. Pero si nos fijamos en sus orígenes (uno proviene de las matemáticas y el otro de la informática), entonces tiene más sentido su comportamiento diferente.
Puedes mirar detrás de los conceptos:
================================================== ================
I) División de piso, también conocida como la función de piso aplicada a la división matemática
La función de piso es un concepto muy bien establecido en matemáticas.
De mathworld.wolfram :
Entonces, la división de piso no es más que la función de piso aplicada a la división matemática. El comportamiento es muy claro, "matemáticamente preciso".
II) Tipo de conversión / Tipo de fundición
De wikipedia :
En la mayoría de los lenguajes de programación, la forma de conversión flotante a entero se aplica mediante una regla de redondeo (por lo que existe una convención):
Regla de redondeo según IEEE 754 .
En otras palabras, la razón de la diferencia entre la división de enteros y la conversión de flotación a int en python es matemática, aquí hay algunos pensamientos de Guido van Rossum (supongo que no tengo que presentarlo: D) (del blog La historia de Python, artículo "Por qué los pisos de la división entera de Python" )
fuente