Une implémentation PHP de l'algorithme de la largest remainder method . Cette méthode est le moyen le plus courant de résoudre les problèmes d'arrondi lorsque vous travaillez avec des valeurs de pourcentage arrondies.
Supposons l'exemple suivant :
18.562874251497007%
20.958083832335326%
18.562874251497007%
19.161676646706585%
22.75449101796407%
En arrondissant les pourcentages ci-dessus à l’aide des fonctions d’arrondi de PHP, nous obtenons :
19%
21%
19%
19%
23%
Ce qui revient en fait à 101%
au lieu de 100%
. La largest remainder method résout ce problème en procédant comme suit :
composer require " kschu91/largest-remainder-method "
Si vous n'êtes pas familier avec composer : utilisation de base de composer
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
print_r ( $ lr -> round ());
ce qui se traduit par :
Array
(
[0] => 19
[1] => 21
[2] => 18
[3] => 19
[4] => 23
)
La précision par défaut est définie sur 0
. Mais vous pouvez modifier ce comportement en utilisant la méthode setPrecision
:
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
$ lr -> setPrecision ( 2 );
print_r ( $ lr -> round ());
ce qui se traduit par :
Array
(
[0] => 18.56
[1] => 20.96
[2] => 18.56
[3] => 19.16
[4] => 22.76
)
La plupart du temps, vous n'avez pas les nombres auxquels vous souhaitez appliquer cet algorithme dans un tableau simple comme dans les exemples ci-dessus. Vous les disposez plutôt dans des objets ou des tableaux associatifs. C'est pourquoi cette bibliothèque prend également en charge les rappels pour appliquer cet algorithme.
Il vous suffit de fournir 2 rappels à la méthode usort
. Le premier, pour récupérer le numéro pertinent de l’objet. Et le second pour réécrire le nombre arrondi dans l'objet résultant.
Assurez-vous de transmettre le premier argument du rappel du setter comme référence, par exemple. comme dans l'exemple ci-dessous :
&$item
. Dans le cas contraire, les données obtenues conserveront leurs chiffres d'origine et ne seront pas arrondies.
$ 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 ;
}
));
ce qui donne :
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
)
)