Numeri PHP: Una Guida Completa
Scopri come PHP gestisce interi e float, operazioni aritmetiche, divisione intera, precisione dei float, funzioni matematiche e formattazione dei numeri.
I numeri sono al centro di quasi ogni programma PHP — contare elementi, calcolare prezzi, misurare dimensioni. Questo capitolo tratta i due tipi numerici offerti da PHP, come scrivere numeri in diverse notazioni, le operazioni aritmetiche e le funzioni matematiche più utilizzate, il problema della precisione dei float che coglie di sorpresa ogni sviluppatore almeno una volta, e come formattare e validare i numeri in modo sicuro.
Comprendere i Tipi di Dati Numerici in PHP
PHP dispone di due tipi di dati numerici:
int(intero) — un numero intero senza parte frazionaria, come42o-7.float(virgola mobile, detto anchedouble) — un numero con parte frazionaria, come3.14o-0.5.
PHP è a tipizzazione debole, quindi non è necessario dichiarare il tipo. PHP sceglie automaticamente int o float in base al letterale che si scrive e alle operazioni eseguite. È possibile verificare il tipo a runtime con gettype() o var_dump().
La dimensione di un intero dipende dalla piattaforma. Su un sistema a 64 bit (il caso comune oggi) un intero va da -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807; su un sistema a 32 bit l'intervallo è da -2.147.483.648 a 2.147.483.647. Il limite esatto è disponibile come costante PHP_INT_MAX. Quando un calcolo lo supera, PHP converte silenziosamente il risultato in float anziché andare in overflow — quindi gli interi molto grandi possono perdere precisione.
Scrivere Letterali Numerici
Non si è limitati alla semplice notazione decimale. PHP comprende diverse basi, oltre ai trattini bassi per la leggibilità:
<?php
$dec = 42; // decimal integer
$float = 3.14; // floating-point
$hex = 0x1A; // hexadecimal, equals 26
$oct = 0o17; // octal (PHP 8.1+ "0o" prefix), equals 15
$bin = 0b101; // binary, equals 5
$big = 1_000_000; // underscores are ignored (PHP 7.4+), equals 1000000
echo $hex, "\n"; // 26
echo $oct, "\n"; // 15
echo $bin, "\n"; // 5
echo $big, "\n"; // 1000000
var_dump($dec); // int(42)
var_dump($float); // float(3.14)
?>I trattini bassi sono puramente estetici — PHP li ignora — ma rendono i numeri lunghi come 1_000_000 molto più facili da leggere. Consulta il capitolo sui Tipi di Dati PHP per vedere come questi si affiancano a stringhe, booleani e array.
Operazioni Aritmetiche in PHP
PHP supporta gli operatori aritmetici standard: addizione (+), sottrazione (-), moltiplicazione (*), divisione (/), modulo (%) ed elevamento a potenza (**). Il set completo è trattato in Operatori PHP. Ecco ciascuna delle operazioni principali in azione:
<?php
$num1 = 10;
$num2 = 5;
// Addition
$result = $num1 + $num2;
echo "\$num1 + \$num2 = ";
echo $result; // 15
// Subtraction
$result = $num1 - $num2;
echo "\n\$num1 - \$num2 = ";
echo $result; // 5
// Multiplication
$result = $num1 * $num2;
echo "\n\$num1 * \$num2 = ";
echo $result; // 50
// Division
$result = $num1 / $num2;
echo "\n\$num1 / \$num2 = ";
echo $result; // 2
// Modulus
$result = $num1 % $num2;
echo "\n\$num1 % \$num2 = ";
echo $result; // 0
?>Divisione, Divisione Intera e Modulo
La divisione in PHP ha una particolarità da conoscere. L'operatore / restituisce un float quando il risultato non è un numero intero, e un int quando gli operandi si dividono esattamente. Per un risultato che sia sempre un intero, usa intdiv(). Per il resto, % funziona sugli interi e fmod() funziona sui float:
<?php
var_dump(10 / 4); // float(2.5) — not evenly divisible
var_dump(10 / 5); // int(2) — evenly divisible
var_dump(intdiv(10, 4)); // int(2) — integer division, remainder dropped
var_dump(10 % 4); // int(2) — modulus (remainder)
var_dump(fmod(10.5, 3)); // float(1.5) — floating-point remainder
?>La divisione per zero genera un DivisionByZeroError in PHP 8 e versioni successive, quindi verifica il divisore prima di dividere se potrebbe essere 0.
Precisione dei Numeri in Virgola Mobile
I float non possono rappresentare ogni valore decimale esattamente, poiché vengono memorizzati in binario. Questo porta a una classica sorpresa:
<?php
var_dump(0.1 + 0.2 === 0.3); // bool(false) — not exactly equal!
// Compare floats with a small tolerance instead:
$epsilon = 1e-9;
var_dump(abs((0.1 + 0.2) - 0.3) < $epsilon); // bool(true)
?>0.1 + 0.2 è in realtà 0.30000000000000004, quindi il confronto stretto con === fallisce anche se echo lo arrotonda a 0.3 per la visualizzazione. La regola pratica: non confrontare mai i float con == o === — verifica che la loro differenza sia entro una piccola tolleranza (un epsilon). Per valori monetari e altri calcoli con decimali esatti, memorizza i valori come centesimi interi oppure usa le estensioni BCMath / GMP.
Funzioni Matematiche Avanzate in PHP
Oltre agli operatori, PHP include un ricco set di funzioni matematiche integrate. Le più comuni sono:
abs()— il valore assoluto (non negativo) di un numeroceil()— arrotonda verso l'alto all'intero più vicinofloor()— arrotonda verso il basso all'intero più vicinoround()— arrotonda all'intero più vicino, o a un numero specificato di decimalisqrt()— la radice quadrata di un numeropow()— eleva un numero a una potenza (equivalente all'operatore**)max()/min()— il maggiore / minore tra i valori fornitirand()/random_int()— un numero casuale (random_int()è crittograficamente sicuro)
L'elenco completo si trova nel riferimento Matematica PHP. Ecco una selezione in uso:
<?php
$num1 = -10;
$num2 = 2.7;
// Absolute value
$result = abs($num1);
echo "abs(\$num1) = ";
echo $result . "\n"; // 10
// Round up
$result = ceil($num2);
echo "ceil(\$num2) = ";
echo $result . "\n"; // 3
// Round down
$result = floor($num2);
echo "floor(\$num2) = ";
echo $result . "\n"; // 2
// Square root
$result = sqrt(9);
echo "sqrt(9) = ";
echo $result . "\n"; // 3
// Raise to power
$result = pow(2, 3);
echo "pow(2, 3) = ";
echo $result; // 8
?>Formattare i Numeri per la Visualizzazione
I numeri grezzi raramente appaiono bene su una pagina. number_format() aggiunge separatori delle migliaia e fissa il numero di decimali, mentre round() controlla la precisione nei calcoli:
<?php
echo number_format(1234567.891, 2), "\n"; // 1,234,567.89
echo number_format(1234567.891, 2, '.', ' '), "\n"; // 1 234 567.89 (custom separators)
echo round(3.14159, 2), "\n"; // 3.14
?>Il secondo e i successivi argomenti di number_format() permettono di impostare il numero di decimali e scegliere i separatori decimali e delle migliaia — utile per output localizzati.
Verifica e Conversione di Valori Numerici
Quando i dati arrivano da moduli, URL o file, sono testo. Validali prima di eseguire operazioni aritmetiche. is_int() e is_float() verificano il tipo effettivo, mentre is_numeric() controlla se una stringa assomiglia a un numero. Per convertire, usa il cast con (int) / (float) oppure floatval():
<?php
var_dump(is_int(42)); // bool(true)
var_dump(is_float(3.14)); // bool(true)
var_dump(is_numeric("123")); // bool(true) — numeric string
var_dump(is_numeric("12abc")); // bool(false) — not numeric
echo (int) "42px", "\n"; // 42 — leading digits are kept, the rest dropped
echo PHP_INT_MAX, "\n"; // 9223372036854775807 on a 64-bit system
?>I controlli di tipo correlati hanno i propri capitoli: is_int() e is_float().
Conclusione
In conclusione, i numeri svolgono un ruolo fondamentale nella programmazione PHP ed è importante avere una solida comprensione di come lavorare con essi. Che tu stia eseguendo operazioni aritmetiche di base o funzioni matematiche avanzate, PHP fornisce una varietà di strumenti per portare a termine il lavoro. Con le conoscenze acquisite da questo articolo, sei ora in grado di affrontare qualsiasi operazione numerica nei tuoi progetti PHP.