2010-12-10 11 views
9

Von dieser Frage abgeleitet: (Java) How does java do modulus calculations with negative numbers?Wie ist -13% 64 = -13 in PHP?

Überall, um PHP zu zwingen, positive 51 zurückzugeben?

Update
der Suche nach einer Konfiguration zu beheben Einstellung, anstatt hart zu raten

oder andere mathematische Funktion wie bcmath?

aktualisiert
Nicht ganz überzeugt von dieser Java-Antwort, da es nicht wegen der negativen Modul -13+(-64) =?

+1

aktualisiert ... Suche nach Lösung ohne Verwendung der Methode der harten Schätzung – ajreal

+2

Es gibt keine Konfigurationseinstellung, um die Funktionsweise von Mathematik in PHP zu ändern. Wenn es dann wäre, würde es wahrscheinlich PHP brechen, was ich mir vorstellen würde verwendet viele Berechnungen intern – Gareth

+0

Das ist kein beabsichtigter Algorithmus. Überraschenderweise akzeptieren Python und Perl das, aber PHP nicht. Verwenden Sie eine Problemumgehung. Btw, 'fmod()' und 'bcmod()' und 'gmp_mod()' auch nicht. – mario

Antwort

5

Wenn GMP verfügbar ist, können Sie gmp_mod

Berechnet n Modulo d verwenden. Das Ergebnis ist immer nicht negativ, das Vorzeichen von d wird ignoriert.

Beispiel:

echo gmp_strval(gmp_mod('-13', '64')); // 51 

Beachten Sie, dass n und d haben GMP Anzahl Ressourcen oder numerischen Strings sein. Alles andere wird nicht

echo gmp_strval(gmp_mod(-13, 64)); 
echo gmp_mod(-13, 64); 

werden beide Rückkehr -51 statt (which is a bug) work¹.

¹läuft die oben in diesem codepad, wird 51 in allen drei Fällen produzieren. Es wird das nicht auf meiner Entwicklungsmaschine tun.

+0

klingt vernünftig – ajreal

12

Auf jeden Fall nimmt der Beitrag, den Sie bereits verwiesen gab die richtige Antwort:

$r = $x % $n; 
if ($r < 0) 
{ 
    $r += abs($n); 
} 

Wobei $ x = -13 und $ n = 64.

+0

Gibt es eine Konfiguration für den Modul statt selbst? – ajreal

+1

Es ist nicht zu raten, nur zu berechnen, (wow) du machst schon einiges. – Gareth

+1

Das 'if' sollte vorzugsweise' while' sein. – mario

0

Die PHP manual sagt, dass

Das Ergebnis des Modulo-Operators% hat das gleiche Vorzeichen wie der Dividend - das heißt, das Ergebnis von $ a% $ b hat das gleiche Vorzeichen wie $ a. Zum Beispiel

so das ist nicht konfigurierbar. Verwenden Sie die vorgeschlagenen Optionen in der Frage, die Sie

verknüpft
3

Die Modulo-Operation sollte den Rest der Division einer Zahl durch einen anderen finden. Aber strenggenommen in den meisten Mainstream-Programmiersprachen Fehlfunktionen der Modulo-Betrieb, wenn Dividend oder/und Divisor negativ sind. Dazu gehören PHP, Perl, Python, Java, C, C++, etc.

Warum sage ich Fehlfunktion? Denn nach mathematischer Definition a remainder must be zero or positive.

Die einfache Lösung ist der Fall, selbst zu behandeln:

if r < 0 then r = r + |divisor|; 

| Divisor | ist der absolute Wert des Divisors.

Eine andere Lösung besteht darin, eine Bibliothek zu verwenden (wie @Gordon gezeigt hat). Ich würde jedoch keine Bibliothek verwenden, um einen einfachen Fall wie diesen zu behandeln.