Eine PHP-Implementierung des Algorithmus der largest remainder method . Diese Methode ist die gebräuchlichste Methode, um Rundungsprobleme beim Arbeiten mit gerundeten Prozentwerten zu beseitigen.
Nehmen Sie das folgende Beispiel an:
18.562874251497007%
20.958083832335326%
18.562874251497007%
19.161676646706585%
22.75449101796407%
Wenn wir die oben genannten Prozentsätze mit den Rundungsfunktionen von PHP runden, erhalten wir:
19%
21%
19%
19%
23%
Was tatsächlich 101%
statt 100%
ergibt. Die largest remainder method löst dieses Problem, indem sie die folgenden Schritte ausführt:
composer require " kschu91/largest-remainder-method "
Wenn Sie mit Composer nicht vertraut sind: Grundlegende Verwendung von Composer
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
print_r ( $ lr -> round ());
was ergibt:
Array
(
[0] => 19
[1] => 21
[2] => 18
[3] => 19
[4] => 23
)
Die Standardgenauigkeit ist auf 0
eingestellt. Sie können dieses Verhalten jedoch ändern, indem Sie die setPrecision
-Methode verwenden:
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
$ lr -> setPrecision ( 2 );
print_r ( $ lr -> round ());
was ergibt:
Array
(
[0] => 18.56
[1] => 20.96
[2] => 18.56
[3] => 19.16
[4] => 22.76
)
Meistens haben Sie die Zahlen, auf die Sie diesen Algorithmus anwenden möchten, nicht in einem einfachen Array wie in den obigen Beispielen. Sie haben sie lieber in Objekten oder assoziativen Arrays. Aus diesem Grund unterstützt diese Bibliothek auch Rückrufe zur Anwendung dieses Algorithmus.
Sie müssen lediglich zwei Rückrufe für die usort
-Methode bereitstellen. Der erste, um die entsprechende Nummer vom Objekt abzurufen. Und der zweite, um die gerundete Zahl zurück in das resultierende Objekt zu schreiben.
Stellen Sie sicher, dass Sie das erste Argument des Setter-Callbacks als Referenz übergeben, z. B. wie im Beispiel unten:
&$item
. Andernfalls behalten die resultierenden Daten ihre ursprünglichen Zahlen bei und werden nicht gerundet.
$ objects = [
[ ' a ' => 18.562874251497007 ],
[ ' a ' => 20.958083832335326 ],
[ ' a ' => 18.562874251497007 ],
[ ' a ' => 19.161676646706585 ],
[ ' a ' => 22.75449101796407 ]
];
$ lr = new LargestRemainder ( $ objects );
$ lr -> setPrecision ( 2 );
print_r ( $ lr -> uround (
function ( $ item ) {
return $ item [ ' a ' ];
},
function (& $ item , $ value ) {
$ item [ ' a ' ] = $ value ;
}
));
was ergibt:
Array
(
[0] => Array
(
[a] => 18.55
)
[1] => Array
(
[a] => 20.94
)
[2] => Array
(
[a] => 18.55
)
[3] => Array
(
[a] => 19.15
)
[4] => Array
(
[a] => 22.74
)
)