I numeri decimali in PHP: float, esempi e funzioni

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.

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.