Λειτουργίες Floats

Nette\Utils\Floats είναι μια στατική κλάση με χρήσιμες συναρτήσεις για τη σύγκριση αριθμών float.

Εγκατάσταση:

composer require nette/utils

Όλα τα παραδείγματα προϋποθέτουν ότι έχει οριστεί το ακόλουθο ψευδώνυμο κλάσης:

use Nette\Utils\Floats;

Κίνητρο

Αναρωτιέστε για ποιο λόγο υπάρχει μια κλάση σύγκρισης float; Μπορείτε να χρησιμοποιήσετε τους τελεστές <, >, ===, νομίζετε. Αυτό δεν είναι απολύτως αληθές. Τι νομίζετε ότι θα εκτυπώσει αυτός ο κώδικας;

$a = 0.1 + 0.2;
$b = 0.3;
echo $a === $b ? 'same' : 'not same';

Αν εκτελέσετε τον κώδικα, κάποιοι από εσάς θα εκπλαγείτε από το γεγονός ότι το πρόγραμμα εκτύπωσε το not same.

Οι μαθηματικές πράξεις με αριθμούς float προκαλούν σφάλματα λόγω της μετατροπής μεταξύ δεκαδικού και δυαδικού συστήματος. Για παράδειγμα, το 0.1 + 0.2 ισούται με το 0.300000000000000044…. Επομένως, όταν συγκρίνουμε κινητές μονάδες, πρέπει να ανεχόμαστε μια μικρή διαφορά από ένα ορισμένο δεκαδικό ψηφίο.

Και αυτό ακριβώς κάνει η κλάση Floats. Η ακόλουθη σύγκριση θα λειτουργήσει όπως αναμένεται:

echo Floats::areEqual($a, $b) ? 'same': 'not same'; // ίδιο

Όταν προσπαθεί να συγκρίνει το NAN, πετάει μια εξαίρεση \LogicException.

Η κλάση Floats ανέχεται διαφορές μικρότερες από 1e-10. Αν θέλετε να εργαστείτε με μεγαλύτερη ακρίβεια, χρησιμοποιήστε τη βιβλιοθήκη BCMath.

Σύγκριση float

areEqual(float $a, float $b)bool

Επιστρέφει true εάν $a = $b.

Floats::areEqual(10, 10.0); // true

isLessThan(float $a, float $b)bool

Επιστρέφει true εάν $a < $b.

Floats::isLessThan(9.5, 10.2); // true
Floats::isLessThan(INF, 10.2); // false

isLessThanOrEqualTo(float $a, float $b)bool

Επιστρέφει true εάν $a <= $b.

Floats::isLessThanOrEqualTo(9.5, 10.2);    // true
Floats::isLessThanOrEqualTo(10.25, 10.25); // true

isGreaterThan(float $a, float $b)bool

Επιστρέφει true εάν $a > $b.

Floats::isGreaterThan(9.5, -10.2); // true
Floats::isGreaterThan(9.5, 10.2);  // false

isGreaterThanOrEqualTo(float $a, float $b)bool

Επιστρέφει true εάν $a >= $b.

Floats::isGreaterThanOrEqualTo(9.5, 10.2);  // false
Floats::isGreaterThanOrEqualTo(10.2, 10.2); // true

compare(float $a, float $b)int

Αν $a < $b, επιστρέφει -1, αν είναι ίσα επιστρέφει 0 and if $a > $b επιστρέφει 1.

Μπορεί να χρησιμοποιηθεί, για παράδειγμα, με τη συνάρτηση usort.

$arr = [1, 5, 2, -3.5];
usort($arr, [Float::class, 'compare']);
// $arr είναι [-3.5, 1, 2, 5]

Συναρτήσεις βοήθειας

isZero(float $value): bool

Επιστρέφει true αν η τιμή είναι μηδέν.

Floats::isZero(0.0); // true
Floats::isZero(0);   // true

isInteger(float $value): bool

Επιστρέφει true εάν η τιμή είναι ακέραιος αριθμός.

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
έκδοση: 4.0