2011-03-02 13 views
8

He esta función PHP que no funciona para los números negativos:¿Por qué el operador de módulo se comporta de manera diferente en Perl y PHP?

function isOdd($num) 
{ 
    return $num % 2 == 1; 
} 

pero funciona para números positivos.

tengo esta rutina Perl, que hace exactamente lo mismo y funciona para números negativos también

sub isOdd() 
{ 
    my ($num) = @_; 
    return $num % 2 == 1; 
} 

¿He cometido ningún error en la traducción de la función? o es un error de PHP?

+0

"no funciona" no es una explicación – zerkms

+0

I significa decir que da resultados erróneos – user640527

+0

@ user640527: y por qué no has limitó ¿Qué devuelve '$ num% 2' antes de compararlo con 1? – zerkms

Respuesta

19

En PHP el signo del resultado de x % y es el signo de dividendo que es x pero
en Perl es la señal de la divisor que es y.

Así que en PHP el resultado de $num % 2 puede ser 1, -1 o 0.

Así arreglar su función de comparar el resultado con 0:

function isOdd($num) { 
    return $num % 2 != 0; 
} 
+0

pero ¿por qué? esto es matemática fundamental. ¿Por qué cambia? – user640527

+2

@ user640527: Es una decisión de diseño de idioma. De los idiomas que conozco, Perl y Ruby regresan signo de divisor y C, C++, Java y PHP devuelven signo de dividendo. – codaddict

+1

+1 (documentación asociada) http://www.php.net/manual/en/language.operators.arithmetic.php: "El resultado del operador de módulo% tiene el mismo signo que el dividendo, es decir, el resultado de $ a% $ b tendrá el mismo signo que $ a. " –

Cuestiones relacionadas