2010-02-07 10 views
14

He observado diferentes implementaciones del operador de módulo en Python y Java.Diferencia entre la implementación del módulo en Python Vs Java

Por ejemplo, en Python:

>>> print -300 % 800 
>>> 500 

Mientras que en Java:

System.out.println(-300 % 800); 
-300 

Esto me tomó por sorpresa, ya que pensé que algo tan básico como el módulo fue interpretado universalmente de la misma manera. Soy un fanático de la interpretación de Python (que presumo que es un préstamo de C), aunque veo la lógica detrás de la implementación de Java.

¿Qué prefiere usted generalmente? ¿Hay alguna razón específica para las diferentes interpretaciones? No tengo intención de comenzar una guerra de idiomas, simplemente curioso.

+1

Si estoy leyendo la página de Wikipedia que Alex publicó correctamente, Python's math.fmod devolverá el mismo resultado que el mod de Java. –

Respuesta

6

Prefiero la interpretación de C (también se usa en Python), donde % es de hecho un operador de módulo. Buena discusión en el wikipedia page y los enlaces que contiene (incluyendo un poco acerca de por qué tomar el signo del dividendo en su lugar puede llevar a un error tonto a menos que uno tenga cuidado ;-).

+0

C99 utiliza el signo del dividendo, C89 depende de la implementación, al menos según el artículo que ha vinculado. – ergosys

+0

Puede usar '%' en Java para escribir una función que haga lo mismo que Python; ver http://stackoverflow.com/a/3417242/320036 – z0r

+0

C se comporta como Java, no como Python. – ryancerium

1

En el estándar C, el módulo negativo no está definido, y muchos compiladores C le darán lo que Java le está dando. Sin embargo, en Python, siempre obtendrás un número positivo, que a menudo es más útil, porque significa que puedes hacer adiciones y restas de módulo. Si el módulo negativo fuera a darle un resultado negativo, no funcionaría correctamente.

No tengo idea de qué ventajas tiene obtener un número negativo de un módulo.

0

Prefiero x mod n para dar números entre 0 y n-1 o entre piso (n/2) -n y piso (n/2); esto hace que sea más fácil hacer los cálculos en la cabeza.

Siempre y cuando todo sea equivalente, realmente no me importa cuando se trata de idiomas, aunque hay que tener en cuenta la convención.

Incidentalmente, Java no puede bastante compensar su mente -% en números enteros negativos devuelve un valor negativo, el método de java.math.BigInteger valores devuelve mod entre 0 y n-1 (inclusive), y el método de divideAndRemainder de nuevo rendimientos negativos valores para enteros negativos

3

Ahora intente esto:

>>> print 300 % -800 
-500 

La razón de esta diferencia es que no puede parecer que los diseñadores de lenguaje para decidir si el resto después de la división debe tener el signo del dividendo o el divisor . Algunos idiomas ni siquiera especifican uno u otro, por lo que depende del implementador.

Hay una lista de idiomas, el operador y el signo que debe esperar en la página de Wikipedia Modulo operation. Es un buen lugar para comenzar, pero normalmente realizo algunas pruebas simples para asegurarme de que sé exactamente cómo se comportará % antes de usarlo en cualquier idioma que no haya probado antes.

Cuestiones relacionadas