La guía o código que hallarás en este post es la resolución más sencilla y válida que encontramos a tu duda o dilema.
Solución:
No son lo mismo cuando el segundo argumento es negativo:
2 `mod` (-3) == -1
2 `rem` (-3) == 2
Sí, esas funciones actúan de manera diferente. Como se define en la documentación oficial:
quot
es la división entera truncada hacia cero
rem
es un resto entero, que satisface:
(x `quot` y)*y + (x `rem` y) == x
div
es la división entera truncada hacia el infinito negativo
mod
es módulo entero, satisfaciendo:
(x `div` y)*y + (x `mod` y) == x
Realmente puedes notar la diferencia cuando usas un número negativo como segundo parámetro y el resultado no es cero:
5 `mod` 3 == 2
5 `rem` 3 == 2
5 `mod` (-3) == -1
5 `rem` (-3) == 2
(-5) `mod` 3 == 1
(-5) `rem` 3 == -2
(-5) `mod` (-3) == -2
(-5) `rem` (-3) == -2
Hablando practicamente:
Si sabe que ambos operandos son positivos, generalmente debe usar quot
, rem
o quotRem
para la eficiencia.
Si no sabe que ambos operandos son positivos, debe pensar en cómo quiere que se vean los resultados. probablemente no quieras quotRem
pero es posible que no quieras divMod
o. los (x `div` y)*y + (x `mod` y) == x
La ley es muy buena, pero redondear la división hacia el infinito negativo (división al estilo de Knuth) suele ser menos útil y menos eficiente que asegurar que 0 <= x `mod` y < y
(División euclidiana).
Si entiendes que ha sido de ayuda nuestro artículo, agradeceríamos que lo compartas con el resto desarrolladores y nos ayudes a difundir nuestro contenido.