Praca z liczbami zmiennoprzecinkowymi (float)
Nette\Utils\Floats to statyczna klasa z przydatnymi funkcjami do porównywania liczb dziesiętnych (zmiennoprzecinkowych).
Instalacja:
Wszystkie przykłady zakładają, że został utworzony alias:
Motywacja
Zastanawiasz się, po co właściwie klasa do porównywania liczb zmiennoprzecinkowych? Przecież mogę użyć operatorów
<
, >
, ===
i mam spokój. Nie jest to do końca prawda. Co myślisz, że wypisze
ten kod?
Jeśli uruchomisz kod, niektórzy z was na pewno będą zaskoczeni, że program wypisał not same
.
Podczas operacji matematycznych na liczbach dziesiętnych dochodzi do błędów wynikających z konwersji między systemem
dziesiętnym a binarnym. Na przykład 0.1 + 0.2
daje 0.300000000000000044…
. Dlatego przy porównywaniu
musimy tolerować niewielką różnicę od pewnego miejsca dziesiętnego.
I to właśnie robi klasa Floats
. Poniższe porównanie będzie już działać zgodnie z oczekiwaniami:
Przy próbie porównania NAN
rzuca wyjątek \LogicException
.
Klasa Floats
toleruje różnice mniejsze niż 1e-10
. Jeśli potrzebujesz pracować
z większą precyzją, użyj biblioteki BCMath.
Porównywanie liczb zmiennoprzecinkowych
areEqual(float $a, float $b): bool
Zwraca true
, jeśli $a
= $b
.
isLessThan(float $a, float $b): bool
Zwraca true
, jeśli zachodzi $a
< $b
.
isLessThanOrEqualTo(float $a, float $b): bool
Zwraca true
, jeśli zachodzi $a
<= $b
.
isGreaterThan(float $a, float $b): bool
Zwraca true
, jeśli zachodzi $a
> $b
.
isGreaterThanOrEqualTo(float $a, float $b): bool
Zwraca true
, jeśli zachodzi $a
>= $b
.
compare(float $a, float $b): int
Jeśli $a
< $b
, zwraca -1
, jeśli są równe, zwraca 0
, a jeśli
$a
> $b
, zwraca 1
.
Można użyć na przykład z funkcją usort
.
Funkcje pomocnicze
isZero(float $value): bool
Zwraca true
, jeśli wartość jest równa zero.
isInteger(float $value): bool
Zwraca true
, jeśli wartość jest liczbą całkowitą.