Comment est--13% = 64 -13 en PHP?
Question
Dérivé de cette question: (Java) Comment ne java effectuer des calculs de module avec des nombres négatifs
Anywhere pour forcer PHP à rendement positif 51?
mise à jour
Vous cherchez un paramètre de configuration pour fixer, à la place dur deviner
ou une autre fonction mathématique comme bcmath?
mise à jour
Non convaincu par toute cette réponse java, car il ne tient pas compte du module négatif
-13+(-64) =?
La solution
Si GMP est disponible, vous pouvez utiliser gmp_mod
Calcule n modulo d. Le résultat est toujours non négatif, le signe de d est ignoré.
Exemple:
echo gmp_strval(gmp_mod('-13', '64')); // 51
Notez que n
et d
doivent être des ressources numériques BPF ou des chaînes numériques. Rien d'autre ne sera pas work¹
echo gmp_strval(gmp_mod(-13, 64));
echo gmp_mod(-13, 64);
sera à la fois le retour au lieu -51 ( qui est un bug ).
¹ en cours d'exécution ci-dessus dans cette CodePad, produira 51 dans les trois cas. Il ne le fera pas sur ma machine de développement.
Autres conseils
Quoi qu'il en soit, le poste que vous avez mentionné déjà donné la réponse correcte:
$r = $x % $n;
if ($r < 0)
{
$r += abs($n);
}
Où $ x = -13 et n = 64 $.
L'opération modulo doit trouver le reste de la division d'un nombre par un autre. Mais à strictement parler dans la plupart des langages de programmation grand public les dysfonctionnements de fonctionnement modulo si dividende et / ou diviseur sont négatifs . Cela inclut PHP, Perl, Python, Java, C, C ++, etc.
Pourquoi je dis un dysfonctionnement? Parce que, selon la définition mathématique, un reste doit être nul ou positif .
La solution simple consiste à traiter le cas vous:
if r < 0 then r = r + |divisor|;
| divisor | est la valeur absolue du diviseur.
Une autre solution consiste à utiliser une bibliothèque (comme @Gordon a). Cependant, je ne voudrais pas utiliser une bibliothèque pour traiter un cas simple comme celui-ci.
Le manuel PHP indique que
Le résultat du% de l'opérateur de module a le même signe que le dividende - qui est le résultat de $ a% $ b aura le même signe que $ a. Par exemple
donc ce n'est pas configurable. Utilisez les options proposées dans la question que vous lié à