Lavorare con i float
Nette\Utils\Floats è una classe statica con funzioni utili per confrontare numeri decimali.
Installazione:
composer require nette/utils Tutti gli esempi presuppongono la creazione di un alias:
use Nette\Utils\Floats; Motivazione
Ti starai chiedendo, perché una classe per confrontare i float? Dopotutto, posso usare gli operatori <, >, === e sono a posto. Non è del tutto vero. Cosa pensi che stamperà questo codice?
$a = 0.1 + 0.2; $b = 0.3; echo $a === $b ? 'uguale' : 'non uguale'; // Tradotto "same" e "not same" Se esegui il codice, alcuni di voi saranno sicuramente sorpresi che il programma abbia stampato non uguale.
Durante le operazioni matematiche con numeri decimali, si verificano errori a causa della conversione tra il sistema decimale e quello binario. Ad esempio, 0.1 + 0.2 risulta 0.300000000000000044…. Pertanto, durante il confronto, dobbiamo tollerare una piccola differenza a partire da una certa posizione decimale.
Ed è proprio quello che fa la classe Floats. Il seguente confronto funzionerà come previsto:
echo Floats::areEqual($a, $b) ? 'uguale' : 'non uguale'; // uguale Quando si tenta di confrontare NAN, lancia un'eccezione \LogicException.
La classe Floats tollera differenze inferiori a 1e-10. Se hai bisogno di lavorare con una precisione maggiore, usa piuttosto la libreria BCMath.
Confronto di float
areEqual (float $a, float $b): bool
Restituisce true se $a = $b.
Floats::areEqual(10, 10.0); // true isLessThan (float $a, float $b): bool
Restituisce true se $a < $b.
Floats::isLessThan(9.5, 10.2); // true Floats::isLessThan(INF, 10.2); // false isLessThanOrEqualTo (float $a, float $b): bool
Restituisce true se $a <= $b.
Floats::isLessThanOrEqualTo(9.5, 10.2); // true Floats::isLessThanOrEqualTo(10.25, 10.25); // true isGreaterThan (float $a, float $b): bool
Restituisce true se $a > $b.
Floats::isGreaterThan(9.5, -10.2); // true Floats::isGreaterThan(9.5, 10.2); // false isGreaterThanOrEqualTo (float $a, float $b): bool
Restituisce true se $a >= $b.
Floats::isGreaterThanOrEqualTo(9.5, 10.2); // false Floats::isGreaterThanOrEqualTo(10.2, 10.2); // true compare (float $a, float $b): int
Se $a < $b, restituisce -1, se sono uguali restituisce 0, e se $a > $b restituisce 1.
Può essere utilizzato, ad esempio, con la funzione usort.
$arr = [1, 5, 2, -3.5]; usort($arr, [Floats::class, 'compare']); // $arr è ora [-3.5, 1, 2, 5] Funzioni ausiliarie
isZero (float $value): bool
Restituisce true se il valore è uguale a zero.
Floats::isZero(0.0); // true Floats::isZero(0); // true isInteger (float $value): bool
Restituisce true se il valore è un numero intero.
Floats::isInteger(0); // true Floats::isInteger(0.0); // true Floats::isInteger(-5.0); // true Floats::isInteger(-5.1); // false Floats::isInteger(INF); // false Floats::isInteger(NAN); // false