round($x) arrotonda all'intero più vicino, floor($x) arrotonda sempre per difetto e ceil($x) sempre per eccesso. Passa a round() un secondo argomento per i decimali: round(3.14159, 2) vale 3.14.
Tutte e tre restituiscono un float, anche quando il valore è intero. var_dump(round(5)) stampa float(5), quindi fai un cast con (int) quando ti serve un intero.
Arrotondare a 2 decimali
Il secondo argomento di round() è la precisione. Un numero positivo arrotonda a quel numero di decimali. Un numero negativo arrotonda a sinistra della virgola, comodo per cifre approssimative come "circa 1.200 visitatori".
round(3.10, 2) stampa 3.1 perché un float non sa quanti zeri volevi. Quando il numero finisce su una pagina (prezzi, percentuali), formattalo: number_format() trasforma 3.1 in "3.10" con number_format(3.1, 2), e sprintf('%.2f', $x) fa lo stesso.
Arrotondare la metà per eccesso, per difetto o al pari
Di default round() arrotonda la metà allontanandosi dallo zero, cioè l'arrotondamento che quasi tutti hanno imparato a scuola. Il terzo argomento sceglie una regola diversa per i valori esattamente a metà tra due numeri.
PHP_ROUND_HALF_EVEN è l'"arrotondamento bancario": le metà vanno al numero pari più vicino, così arrotondando molti valori il totale non deriva verso l'alto nel tempo. Il codice di contabilità spesso lo richiede.
floor e ceil con i numeri negativi
floor() si sposta verso meno infinito e ceil() verso più infinito. Con i numeri negativi questo sorprende: floor(-3.5) vale -4, non -3. Se vuoi tagliare i decimali (troncare verso lo zero), fai invece un cast a int.
La riga della paginazione è l'uso classico di ceil(): anche un solo elemento avanzato ha bisogno di una pagina.
Divisione intera e modulo
/ restituisce un float quando la divisione non è esatta, quindi 7 / 2 vale 3.5. Per la divisione intera usa intdiv(), che scarta il resto, e % per il resto stesso.
% converte prima entrambi gli operandi in interi, quindi 7.5 % 2 vale 1, e da PHP 8.1 stampa anche Deprecated: Implicit conversion from float 7.5 to int loses precision. Usa fmod() quando i decimali contano. Dividere per zero con /, intdiv() o % lancia un DivisionByZeroError in PHP 8, quindi controlla prima il divisore quando arriva dall'input.
Potenze, radici, abs, max e min
** eleva a potenza (pow() fa lo stesso), sqrt() calcola la radice quadrata e abs() toglie il segno. max() e min() accettano più argomenti oppure un solo array.
** viene valutato da destra a sinistra, quindi 2 ** 3 ** 2 significa 2 ** 9. La coppia max(0, min(100, $x)) è il modo consueto per limitare un valore tra un minimo e un massimo. M_PI contiene pi greco se ti serve per i cerchi.
Numeri casuali con random_int e rand
random_int($min, $max) restituisce un intero casuale con entrambi gli estremi inclusi. L'output cambia a ogni esecuzione, quindi premi Run qualche volta.
Usa random_int() per tutto ciò che riguarda la sicurezza: codici di accesso, token, link per reimpostare la password. rand() e mt_rand() funzionano ancora e accettano gli stessi argomenti ($min, $max), ma la loro sequenza si può prevedere. Per mescolare e scegliere con una sorgente sicura, PHP 8.2 ha aggiunto Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Perché a volte floor() dà il risultato sbagliato
I float sono memorizzati in binario e molti valori decimali (come 0.1) non si possono memorizzare in modo esatto. Quasi sempre la stampa lo nasconde, ma floor() e (int) non arrotondano, tagliano, e un valore come 7.999999999 diventa 7.
Quando ti servono decimali esatti, come con il denaro, memorizza unità intere (centesimi come interi: 1999 invece di 19.99) e dividi solo per la visualizzazione. Anche arrotondare a una precisione ragionevole prima di floor() o ceil(), come nell'ultima riga, risolve la maggior parte dei casi.
Domande frequenti
Come arrotondo a 2 decimali in PHP?
Passa il numero di decimali come secondo argomento: round(3.14159, 2) restituisce 3.14. Restituisce un float, quindi per mostrare un numero fisso di decimali (3.10 invece di 3.1) usa number_format($x, 2) o sprintf('%.2f', $x).
Come arrotondo per difetto in PHP?
floor($x) arrotonda al numero intero inferiore: floor(4.9) vale 4 e floor(-4.1) vale -5. Per eliminare invece i decimali verso lo zero, fai un cast con (int) $x, che trasforma -4.9 in -4.
Perché round() restituisce un float in PHP?
round(), floor() e ceil() restituiscono sempre un float, anche quando il risultato è intero: var_dump(round(5)) stampa float(5). Racchiudi la chiamata in (int) o intval() quando ti serve un intero, per esempio come indice di un array.
Qual è la differenza tra rand() e random_int() in PHP?
random_int(1, 6) usa una sorgente crittograficamente sicura ed è quella da usare per token, codici e qualsiasi cosa un utente potrebbe provare a indovinare. rand() e mt_rand() sono più veloci ma prevedibili. Tutte e tre includono entrambi gli estremi dell'intervallo.
Come ottengo il resto di una divisione in PHP?
Usa l'operatore % per gli interi: 17 % 5 vale 2. Il risultato prende il segno dell'operando di sinistra, quindi -7 % 3 vale -1. Per i float usa fmod(7.5, 2), che restituisce 1.5.