In PHP i numeri decimali vengono indicati con la parola chiave float
(floats al plurale). Vengono chiamati anche floating point numbers, doubles o real numbers.
Vanno distinti dai numeri interi, che invece vengono identificati con la parola chiave int
.
Per definire un numero decimale metto la parte intera prima del punto e la parte decimale dopo:
<?php
$float1 = 4.592;
$float2 = 45.39;
$float3 = -2.17;
$float4 = 673.7859;
?>
È bene chiarire che NON si usa la virgola, ma soltanto il punto.
Adesso, con il costrutto echo
mostriamo sulla pagina web i seguenti numeri decimali:
<?php
$float1 = 0.33;
$float2 = 1.19;
$float3 = 7.4969;
$float4 = 678.59;
$float5 = 48.659390;
$float6 = -3.592;
$float7 = -949.40;
$float8 = -0.5;
echo $float1;
echo "<br>";
echo $float2;
echo "<br>";
echo $float3;
echo "<br>";
echo $float4;
echo "<br>";
echo $float5;
echo "<br>";
echo $float6;
echo "<br>";
echo $float7;
echo "<br>";
echo $float8;
?>
Risultato:
0.33
1.19
7.4969
678.59
48.65939
-3.592
-949.4
-0.5
Per migliorare la leggibilità del numero, è possibile utilizzare il simbolo underscore “_
” solo per la parte decimale:
<?php
$float9 = 1_670.848; // mille seicento settanta punto otto quattro otto
$float10 = 44_592.23;
$float11 = 1_240_238.674;
$float12 = 28_482_598.3954;
echo $float9;
echo "<br>";
echo $float10;
echo "<br>";
echo $float11;
echo "<br>";
echo $float12;
?>
Risultato:
1670.848
44592.23
1240238.674
28482598.3954
L’interprete di PHP toglierà tutti gli underscore interpretando i numeri prima del punto come intero e quelli dopo come decimali.
Quindi l’utilizzo degli underscore serve soltanto a noi sviluppatori per migliorare la leggibilità dei numeri durante la scrittura di un programma.
È bene sottolineare che questa sintassi è valida solo dopo la versione 7.4.0 di PHP.
Indice riassuntivo
La precisione dei numeri decimali
I numeri decimali in PHP, ma come in tutti i linguaggi di programmazione, hanno una precisione limitata.
Ad esempio, la somma 0.3 + 0.3 darà un risultato pari a 0.59999999… e non 0.6. Quindi per numeri ancor più piccoli (ad esempio 0.0003, 0.000005, 0.00000001) il margine di errore sarà ancor più grande.
Quindi bisogna fare attenzione a questo margine di errore quando si fanno molti calcoli uno dopo l’altro con i numeri decimali oppure quando si mettono a confronto numeri decimali con ==
o ===
.
Aggiornamento: nelle ultime versioni (PHP 8 e PHP 7) il grado di precisione dei numeri decimali è aumentato. Quindi la somma tra 0.3 e 0.3 sarà 0.6. Con ciò è aumentata la precisione anche dei numeri decimali più piccoli, quindi con più posizioni prima il punto.
Per cui in queste versioni è possibile godere di un minor errore durante il calcolo con i numeri decimali.
Convertire in numero decimale con floatval
In PHP la funzione floatval()
viene utilizzata per convertire un tipo di dato in un numero decimale.
Tra singoli o doppi apici possiamo definire quello che per noi è un numero decimale, ma per PHP è una stringa:
<?php
$string1 = "13.7852";
$string2 = '22.89';
?>
Proviamo a usare la funzione var_dump
per ottenere il tipo di dato:
<?php
$string1 = "13.7852";
$string2 = '22.89';
var_dump( $string1 );
echo "<br>",
var_dump( $string2 );
?>
Risultato:
string(7) "13.7852"
string(5) "22.89"
Adesso richiamo le variabili $string1
e $string2
con la funzione floatval()
per effettuare la conversione e riassegno il nuovo valore alle stesse variabili, quindi effettuiamo la conversione:
<?php
// Definisco due stringhe con dei numeri decimali
$string1 = "13.7852";
$string2 = '22.89';
// Effettuiamo la conversione nelle stesse variabili con floatval()
$string1 = floatval( $string1 );
$string2 = floatval( $string2 );
// Analizziamo le variabili con var_dump()
var_dump( $string1 );
echo "<br>",
var_dump( $string2 );
?>
Ora vediamo cosa otteniamo:
float(13.7852)
float(22.89)
Da come puoi vedere la conversione da string
a float
è avvenuta con successo.
I valori null, false, “” (stringa vuota) e array() corrispondono a un numero decimale pari a 0.000000… Che viene abbreviato a 0:
<?php
$null = NULL;
$false = FALSE;
$stringaVuota = "";
$arrayVuoto = array();
echo floatval($null);
echo "<br>";
echo floatval($false);
echo "<br>";
echo floatval($stringaVuota);
echo "<br>";
echo floatval($arrayVuoto);
?>
Risultato:
0
0
0
0
Possiamo convertire anche un numero intero in numero decimale:
<?php
$int = 56;
var_dump( $int );
echo "<br>"; // "Spazio"
$int = floatval( $int );
var_dump( $int );
?>
Risultato:
int(56)
float(56)
Quindi prima il numero si comportava come un numero intero (int
) e adesso come numero decimale (float
), tramite la conversione con la funzione floatval()
.
Ora ti dimostro come PHP converte i tipi di dati in base al contesto in cui si ritrova a decifrare il codice.
Definisco un numero intero in una variabile e poi lo moltiplico per 5 dentro la funzione var_dump
per analizzarne il risultato, poi facciamo la stessa cosa ma moltiplicando la variabile per 5.5:
<?php
$int = 2;
var_dump($int * 5);
echo "<br>";
var_dump($int * 5.3);
?>
Risultato:
int(10)
float(10.6)
Il primo risultato è un numero intero “int(10)
“, mentre il secondo è un numero decimale “float(10.6)
“. Quindi a giudicare dal secondo risultato possiamo dire che PHP ha convertito il tutto in float.
Questo perché abbiamo moltiplicato un numero intero per un numero decimale: PHP per darci un risultato più accettabile ci ha restituito il risultato in formato decimale.
Riconoscere un numero decimale con is_float
In PHP con la funzione is_float()
possiamo riconoscere se un numero è decimale oppure no.
Passando una variabile o un valore, questa funzione ritornerà il valore TRUE
se il valore passato è un numero decimale, altrimenti ritornerà FALSE
.
Inseriamo la funzione is_float
nella funzione var_dump
per analizzare il valore booleano che otteniamo:
<?php
$var1 = "64.59";
$var2 = "Michele";
$var3 = 67.34;
$var4 = -0.56;
$var5 = '0.35';
$var6 = true;
var_dump( is_float($var1) );
echo "<br>";
var_dump( is_float($var2) );
echo "<br>";
var_dump( is_float($var3) );
echo "<br>";
var_dump( is_float($var4) );
echo "<br>";
var_dump( is_float($var5) );
echo "<br>";
var_dump( is_float($var6) );
?>
Risultato:
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)
bool(false)
Da come è possibile giudicare dai risultati, solo le variabili $var3
e $var4
contengono numeri decimali.