Was ist die beste Funktion oder Methode zur Berechnung von Modulo (Rest von $ a geteilt durch $ b) in PHP?

7

PHP bietet verschiedene Funktionen zur Berechnung des Moduls:

  1. Moduloperator % : echo ($a % $b);
  2. fmod ()
  3. bcmod ()
  4. gmp_mod ()

Welche Funktion sollte als sicher und effizient angesehen werden? unter Berücksichtigung des (hier beschriebenen Problems von "Division durch Null": Division durch Null-Fehler bei der Verwendung von Modulo und schwebende Zahlen?

    
Community 06.08.2013, 01:02
quelle

4 Antworten

21
  1. Nur der Modulo-Operator (%) und fmod sind nativ

  2. Der Modulo-Operator kann keine Zahlen jenseits von 2^32 verarbeiten (auf PHP mit x86-Architektur)

  3. fmod läuft schneller als bcmod / gmp_mod ~ Benchmark

  4. bcmod funktioniert nicht mit floats ~ hier

Ich glaube, dass es am besten ist, fmod zu verwenden, einfach weil es sich in Mathefunktionen befindet , läuft viel schneller als andere Funktionen und, was am wichtigsten ist, kann mit großen Zahlen und Floats umgehen.

Wenn Sie keine Zahlen nach dem Limit oder den Gleitkommazahlen verwenden möchten, verwenden Sie % , da dies am schnellsten sein sollte.

    
David Chen 06.08.2013, 01:18
quelle
2

Alle Funktionen sind sicher zu bedienen, man weiß, was gerade passiert:

  1. Modulus-Operator: ist schnell, präzise, ​​aber Sie müssen unter dem Maximum int bleiben. In dieser Hinsicht gibt es überhaupt keine Division durch Null.

  2. fmod: Stil schnell, Fließkomma-Betrieb Geschwindigkeit ist kein Problem mehr in den letzten 10 Jahren, aber es ist schwierig. Fließkommazahlen können viel höhere Werte erreichen, aber ihre Präzision nicht. Bei der Arbeit mit großen Zahlen werden daher immer häufiger Rundungsfehler auftreten. Es wird also nichts lösen, was der Modulus-Operator vermissen lässt, sondern Präzisionsprobleme.

  3. bcmod und gmp_mod sind ähnlich. Der Unterschied besteht darin, dass diese Funktionen unterschiedliche Implementierungen (Module) beliebiger Arithmetik verwenden. Ihre Verwendung unterscheidet sich, aber ihre Ergebnisse nicht: Theoretisch ist die Größe der von diesen Bibliotheken unterstützten Zahlen nur durch die Menge an freiem Speicher begrenzt, so dass das Ergebnis praktisch immer gut und präzise ist, jedoch sind die verwendeten Algorithmen sowohl rechnerisch als auch absteigend Speicher Sicht.

sanyi 14.08.2013 20:03
quelle
1

Sie können den Modulo-Operator immer noch verwenden, und er kann trotzdem sicher sein, vorausgesetzt, Sie planen, wie in der folgenden Abbildung gezeigt, eine Null zu erwarten.

%Vor%

Wenn Sie die Warnungen nur ausblenden möchten, können Sie auch einen Error Control Operator verwenden. Mit dem Operator @ wird der Fehler unterdrückt.

Allerdings kann mit % eine ganze Zahl nur so groß werden, bevor sie in einen Gleitkommawert umgewandelt wird, daher die Einführung von bcmod und fmod , aber bitte beachten Sie, dass beide ihre eigenen Einschränkungen haben.

Ich empfehle GMP oder schau dir vielleicht eine der anderen erweiterten mathematischen Funktionen an, Es gibt auch BCMath

Da du etwas Sicheres erwähnt hast, gibt es dafür eine Klasse: Eval Math

Hier ist ein Beispiel mit fmod

%Vor%

gibt 18

aus     
user2069217 08.08.2013 15:08
quelle
0

Beachten Sie, dass fmod NICHT dieser grundlegenden Funktion entspricht:

%Vor%

weil fmod () einen Wert mit dem gleichen Vorzeichen wie $ a zurückgibt. Mit anderen Worten, die floor () - Funktion ist nicht korrekt, da sie auf -INF anstatt auf Null gerundet wird.

Um fmod ($ a, $ b) zu emulieren, ist der richtige Weg:

%Vor%

Beachten Sie, dass beide Funktionen eine DIVISION BY ZERO werfen, wenn $ b null ist.

Die erste Funktion modulo () oben ist die mathematische Funktion, die nützlich ist, um an zyklischen Strukturen zu arbeiten (wie zum Beispiel an Kalenderberechnungen oder an trigonometrischen Funktionen:

%Vor%     
krishna kinnera 13.08.2013 06:30
quelle

Tags und Links