Práce s floaty
Nette\Utils\Floats je statická třída s užitečnými funkcemi pro porovnávání desetinných čísel.
Instalace:
Všechny příklady předpokládají vytvořený alias:
Motivace
Říkáte si, proč vlastně třída na porovnávání floatů? Vždyť můžu použít operátory <
,
>
, ===
a mám vystaráno. Není to tak úplně pravda. Co myslíte, že vypíše tento kód?
Pokud kód spustíte, někteří z vás budou určitě překvapení, že program vypsal not same
.
Při matematických operacích s desetinnými čísly dochází k chybám vlivem převodu mezi desítkovou a binární
soustavou. Třeba 0.1 + 0.2
vychází 0.300000000000000044…
. Proto při porovnávání musíme
tolerovat drobný rozdíl od určitého desetinného místa.
A to právě dělá třída Floats
. Následující porovnání už bude fungovat podle očekávání:
Při pokusu porovnávat NAN
vyhodí výjimku \LogicException
.
Třída Floats
toleruje rozdíly menší než 1e-10
. Pokud potřebujete pracovat
s větší přesností, použijte raději knihovnu BCMath.
Porovnávání floatů
areEqual(float $a, float $b): bool
Vrátí true
pokud $a
= $b
.
isLessThan(float $a, float $b): bool
Vrátí true
pokud platí $a
< $b
.
isLessThanOrEqualTo(float $a, float $b): bool
Vrátí true
pokud platí $a
<= $b
.
isGreaterThan(float $a, float $b): bool
Vrátí true
pokud platí $a
> $b
.
isGreaterThanOrEqualTo(float $a, float $b): bool
Vrátí true
pokud platí $a
>= $b
.
compare(float $a, float $b): int
Pokud jsou $a
< $b
, vrací -1
, pokud se rovnají vrací 0
a pokud je
$a
> $b
vrací 1
.
Lze použít například s funkcí usort
.
Pomocné funkce
isZero(float $value): bool
Vrátí true
, pokud je hodnota rovna nule.
isInteger(float $value): bool
Vrátí true
, pokud je hodnota celé číslo.