Schwebekörper-Funktionen
Nette\Utils\Floats ist eine statische Klasse mit nützlichen Funktionen zum Vergleich von Fließkommazahlen.
Installation:
Alle Beispiele gehen davon aus, dass der folgende Klassenalias definiert ist:
Motivation
Sie fragen sich, wozu eine Float-Vergleichsklasse gut ist? Sie können die Operatoren <
, >
,
===
, denken Sie. Das ist nicht ganz richtig. Was, glauben Sie, wird dieser Code ausgeben?
Wenn Sie den Code ausführen, werden einige von Ihnen überrascht sein, dass das Programm not same
ausgibt.
Bei mathematischen Operationen mit Fließkommazahlen treten aufgrund der Umrechnung zwischen Dezimal- und Binärsystem Fehler
auf. Zum Beispiel entspricht 0.1 + 0.2
0.300000000000000044…
. Daher müssen wir beim Vergleich von
Fließkommazahlen eine kleine Differenz ab einer bestimmten Dezimalstelle tolerieren.
Und genau das tut die Klasse Floats
. Der folgende Vergleich wird wie erwartet funktionieren:
Beim Versuch, NAN
zu vergleichen, kommt es zu einer \LogicException
Ausnahme.
Die Klasse Floats
toleriert Unterschiede, die kleiner sind als 1e-10
. Wenn Sie mit
größerer Genauigkeit arbeiten müssen, verwenden Sie stattdessen die BCMath-Bibliothek.
Float-Vergleich
areEqual(float $a, float $b): bool
Gibt true
zurück, wenn $a
= $b
.
isLessThan(float $a, float $b): bool
Gibt true
zurück, wenn $a
< $b
.
isLessThanOrEqualTo(float $a, float $b): bool
Gibt true
zurück, wenn $a
<= $b
.
isGreaterThan(float $a, float $b): bool
Gibt true
zurück, wenn $a
> $b
.
isGreaterThanOrEqualTo(float $a, float $b): bool
Gibt true
zurück, wenn $a
>= $b
.
compare(float $a, float $b): int
Wenn $a
< $b
ist, wird -1
zurückgegeben, wenn sie gleich sind, wird 0
and if $a
> $b
zurückgegeben und 1
.
Sie kann z. B. mit der Funktion usort
verwendet werden.
Helfer-Funktionen
isZero(float $value): bool
Gibt true
zurück, wenn der Wert Null ist.
isInteger(float $value): bool
Gibt true
zurück, wenn der Wert eine ganze Zahl ist.