round($x) arrondit à l'entier le plus proche, floor($x) arrondit toujours vers le bas et ceil($x) toujours vers le haut. Donnez à round() un second argument pour les décimales : round(3.14159, 2) vaut 3.14.
Les trois renvoient un float, même quand la valeur est entière. var_dump(round(5)) affiche float(5), faites donc un cast (int) quand il vous faut un entier.
Arrondir à 2 décimales
Le second argument de round() est la précision. Un nombre positif arrondit à ce nombre de décimales. Un nombre négatif arrondit à gauche de la virgule, ce qui est pratique pour des chiffres approximatifs comme « environ 1 200 visiteurs ».
round(3.10, 2) affiche 3.1 car un float ne sait pas combien de zéros vous vouliez. Quand le nombre doit apparaître sur une page (prix, pourcentages), formatez-le plutôt : number_format() transforme 3.1 en "3.10" avec number_format(3.1, 2), et sprintf('%.2f', $x) fait la même chose.
Arrondir la moitié vers le haut, vers le bas ou au pair
Par défaut, round() arrondit une moitié en s'éloignant de zéro, l'arrondi au plus proche que la plupart des gens ont appris à l'école. Le troisième argument choisit une autre règle pour les valeurs exactement à mi-chemin entre deux nombres.
PHP_ROUND_HALF_EVEN est « l'arrondi du banquier » : les moitiés vont vers le nombre pair le plus proche, si bien qu'arrondir beaucoup de valeurs ne dérive pas vers le haut au fil du temps. Le code comptable en a souvent besoin.
floor et ceil avec des nombres négatifs
floor() va vers moins l'infini et ceil() vers plus l'infini. Avec des nombres négatifs, cela surprend : floor(-3.5) vaut -4, pas -3. Si vous voulez couper les décimales (troncature vers zéro), faites plutôt un cast en int.
La ligne de pagination est l'usage classique de ceil() : un élément restant a quand même besoin d'une page.
Division entière et modulo
/ renvoie un float quand la division ne tombe pas juste, donc 7 / 2 vaut 3.5. Pour une division entière, utilisez intdiv(), qui supprime le reste, et % pour le reste lui-même.
% convertit d'abord les deux opérandes en entiers, donc 7.5 % 2 vaut 1, et depuis PHP 8.1 il affiche aussi Deprecated: Implicit conversion from float 7.5 to int loses precision. Utilisez fmod() quand les décimales comptent. Diviser par zéro avec /, intdiv() ou % lève une DivisionByZeroError en PHP 8, vérifiez donc le diviseur quand il vient d'une saisie.
Puissances, racines, abs, max et min
** élève à une puissance (pow() fait la même chose), sqrt() calcule une racine carrée et abs() supprime le signe. max() et min() prennent soit plusieurs arguments, soit un tableau.
** est évalué de droite à gauche, donc 2 ** 3 ** 2 signifie 2 ** 9. La paire max(0, min(100, $x)) est la façon habituelle de borner une valeur entre une limite basse et une limite haute. M_PI contient pi si vous en avez besoin pour des cercles.
Nombres aléatoires avec random_int et rand
random_int($min, $max) renvoie un entier aléatoire, bornes incluses. Le résultat change à chaque exécution, cliquez donc plusieurs fois sur Run.
Utilisez random_int() pour tout ce qui touche à la sécurité : codes de connexion, jetons, liens de réinitialisation de mot de passe. rand() et mt_rand() fonctionnent toujours et acceptent les mêmes arguments ($min, $max), mais leur séquence peut être prédite. Pour mélanger et tirer au sort avec une source sûre, PHP 8.2 a ajouté Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Pourquoi floor() donne parfois une mauvaise réponse
Les floats sont stockés en binaire, et beaucoup de valeurs décimales (comme 0.1) ne peuvent pas être stockées exactement. La plupart du temps, l'affichage le cache, mais floor() et (int) n'arrondissent pas, ils coupent, et une valeur comme 7.999999999 devient 7.
Quand vous avez besoin de décimales exactes, comme pour de l'argent, stockez des unités entières (des centimes en entiers : 1999 au lieu de 19.99) et ne divisez que pour l'affichage. Arrondir à une précision raisonnable avant floor() ou ceil(), comme sur la dernière ligne, règle aussi la plupart des cas.
Questions fréquentes
Comment arrondir à 2 décimales en PHP ?
Passez le nombre de décimales en second argument : round(3.14159, 2) renvoie 3.14. Le résultat est un float, donc pour un affichage avec un nombre fixe de décimales (3.10 plutôt que 3.1), utilisez number_format($x, 2) ou sprintf('%.2f', $x).
Comment arrondir vers le bas en PHP ?
floor($x) arrondit à l'entier inférieur : floor(4.9) vaut 4 et floor(-4.1) vaut -5. Pour supprimer les décimales vers zéro, faites plutôt un cast (int) $x, qui transforme -4.9 en -4.
Pourquoi round() renvoie-t-elle un float en PHP ?
round(), floor() et ceil() renvoient toujours un float, même quand le résultat est entier : var_dump(round(5)) affiche float(5). Entourez l'appel de (int) ou intval() quand il vous faut un entier, par exemple comme index de tableau.
Quelle est la différence entre rand() et random_int() en PHP ?
random_int(1, 6) utilise une source cryptographiquement sûre et c'est elle qu'il faut pour les jetons, les codes et tout ce qu'un utilisateur pourrait essayer de deviner. rand() et mt_rand() sont plus rapides mais prévisibles. Les trois incluent les deux bornes de l'intervalle.
Comment obtenir le reste d'une division en PHP ?
Utilisez l'opérateur % pour les entiers : 17 % 5 vaut 2. Le résultat prend le signe de l'opérande de gauche, donc -7 % 3 vaut -1. Pour les floats, utilisez fmod(7.5, 2), qui renvoie 1.5.