Float'larla Çalışma

Nette\Utils\Floats, ondalık sayıları karşılaştırmak için yararlı fonksiyonlar içeren statik bir sınıftır.

Kurulum:

composer require nette/utils

Tüm örnekler, oluşturulmuş bir takma ad varsayar:

use Nette\Utils\Floats;

Motivasyon

Float'ları karşılaştırmak için neden bir sınıfa ihtiyacım var diye düşünüyor olabilirsiniz? Sonuçta <, >, === operatörlerini kullanabilirim ve işim biter. Bu tam olarak doğru değil. Sizce bu kod ne yazdırır?

$a = 0.1 + 0.2;
$b = 0.3;
echo $a === $b ? 'aynı' : 'aynı değil'; // same -> aynı, not same -> aynı değil

Kodu çalıştırırsanız, bazılarınız programın aynı değil yazdırmasına kesinlikle şaşıracaktır.

Ondalık sayılarla yapılan matematiksel işlemlerde, onluk ve ikilik sistemler arasındaki dönüşüm nedeniyle hatalar oluşur. Örneğin, 0.1 + 0.2 sonucu 0.300000000000000044… olur. Bu nedenle, karşılaştırma yaparken belirli bir ondalık basamaktan sonra küçük bir farkı tolere etmemiz gerekir.

Ve işte Floats sınıfı tam olarak bunu yapar. Aşağıdaki karşılaştırma artık beklendiği gibi çalışacaktır:

echo Floats::areEqual($a, $b) ? 'aynı' : 'aynı değil'; // aynı

NAN karşılaştırmaya çalışıldığında \LogicException istisnası fırlatır.

Floats sınıfı 1e-10'dan küçük farkları tolere eder. Daha yüksek hassasiyetle çalışmanız gerekiyorsa, bunun yerine BCMath kütüphanesini kullanın.

Float Karşılaştırması

areEqual (float $a, float $b)bool

Eğer $a = $b ise true döndürür.

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

isLessThan (float $a, float $b)bool

Eğer $a < $b ise true döndürür.

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

isLessThanOrEqualTo (float $a, float $b)bool

Eğer $a <= $b ise true döndürür.

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

isGreaterThan (float $a, float $b)bool

Eğer $a > $b ise true döndürür.

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

isGreaterThanOrEqualTo (float $a, float $b)bool

Eğer $a >= $b ise true döndürür.

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

compare (float $a, float $b)int

Eğer $a < $b ise -1, eğer eşitlerse 0 ve eğer $a > $b ise 1 döndürür.

Örneğin usort fonksiyonu ile kullanılabilir.

$arr = [1, 5, 2, -3.5];
usort($arr, [Floats::class, 'compare']);
// $arr şimdi [-3.5, 1, 2, 5]

Yardımcı Fonksiyonlar

isZero (float $value): bool

Değer sıfıra eşitse true döndürür.

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

isInteger (float $value)bool

Değer bir tamsayı ise true döndürür.

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
versiyon: 4.0