W3docs

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, come 42 o -7.
  • float (virgola mobile, detto anche double) — un numero con parte frazionaria, come 3.14 o -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 numero
  • ceil() — arrotonda verso l'alto all'intero più vicino
  • floor() — arrotonda verso il basso all'intero più vicino
  • round() — arrotonda all'intero più vicino, o a un numero specificato di decimali
  • sqrt() — la radice quadrata di un numero
  • pow() — eleva un numero a una potenza (equivalente all'operatore **)
  • max() / min() — il maggiore / minore tra i valori forniti
  • rand() / 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.

Esercizio

Pratica
Quale delle seguenti affermazioni sui numeri PHP è corretta?
Quale delle seguenti affermazioni sui numeri PHP è corretta?
Was this page helpful?