Takip et

PHP’de Sayılarla Çalışmak: Kapsamlı Bir Rehber

PHP’de Sayılarla Çalışmak: Kapsamlı Bir Rehber PHP, web uygulamaları geliştirmede en popüler dillerden biridir ve hemen hemen her uygulamad

PHP’de Sayılarla Çalışmak: Kapsamlı Bir Rehber

PHP, web uygulamaları geliştirmede en popüler dillerden biridir ve hemen hemen her uygulamada sayılarla işlem yapmak kaçınılmazdır. Veritabanından gelen fiyatları işlemekten, kullanıcı girişlerini doğrulamaya, karmaşık matematiksel hesaplamalar yapmaya kadar sayılar, PHP programlamanın temelini oluşturur. Bu rehberde, PHP’de sayı türlerini, temel aritmetik işlemleri, faydalı sayısal fonksiyonları ve özellikle ondalıklı sayılarla çalışırken dikkat edilmesi gereken hassasiyet konularını detaylı bir şekilde inceleyeceğiz.

PHP’de Sayı Türleri ve Temelleri

PHP, farklı ihtiyaçlara yönelik iki ana sayı türünü destekler: tam sayılar (integers) ve ondalıklı sayılar (floats).

Tam Sayılar (Integers)

Tam sayılar, ondalık kısmı olmayan pozitif veya negatif sayılardır. PHP’de tam sayılar genellikle 64-bit platformlarda -9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 arasında bir aralığa sahiptir. 32-bit platformlarda ise bu aralık daha dardır (-2,147,483,648 ile 2,147,483,647 arası). Bir tam sayı, bu aralığı aştığında otomatik olarak ondalıklı sayıya (float) dönüşür. PHP, tam sayıları onluk (decimal), onaltılık (hexadecimal – 0x ile başlar), sekizlik (octal – 0 ile başlar) ve ikilik (binary – 0b ile başlar) formatlarda destekler.

";
echo "Ürün Kodu (Decimal): " . $urunKodu . "
"; echo "İzinler (Decimal): " . $izinler . "
"; echo "Bayrak (Decimal): " . $bayrak . "
"; var_dump($yas); // int(30) ?>

Ondalıklı Sayılar (Floats / Doubles)

Ondalıklı sayılar, ondalık kısmı olan sayılardır. Bunlara kayan noktalı sayılar (floating-point numbers) veya çift duyarlıklı sayılar (doubles) da denir. PHP’de bu iki terim birbirinin yerine kullanılır. Ondalıklı sayılar, tam sayılardan çok daha geniş bir aralığı ve hassasiyeti temsil edebilir, ancak belirli bir hassasiyetle sınırlıdırlar (genellikle 14-15 basamak). Ondalıklı sayılarla çalışırken hassasiyet kayıplarına dikkat etmek önemlidir.

";
echo "Pi: " . $pi . "
"; echo "Büyük Sayı: " . $buyukSayi . "
"; var_dump($fiyat); // float(19.99) ?>

Sayısal Dizeler (Numeric Strings)

PHP, esnek bir dil olduğu için bazen sayısal değerler dizeler (string) olarak gelebilir (örneğin, form girdileri veya veritabanı sonuçları). PHP, bu tür dizeleri otomatik olarak sayıya dönüştürmeye çalışır. Bu, çoğu zaman kullanışlı olsa da, beklenmedik sonuçlara yol açabilir.

"; // Çıktı: 130

$karisikString = "10 elma";
$sonuc = $karisikString + 5; // PHP "10"u alır, " elma" kısmını görmezden gelir.
                             // Bu bir uyarı (E_WARNING) verebilir.

echo "Sonuç: " . $sonuc . "
"; // Çıktı: 15 ?>

Bir değişkenin sayısal bir değer olup olmadığını kontrol etmek için is_numeric(), is_int() (veya is_integer()), is_float() (veya is_double()) gibi fonksiyonları kullanabilirsiniz.

";     // true
echo "b is_float: " . (is_float($b) ? 'true' : 'false') . "
"; // true echo "c is_numeric: " . (is_numeric($c) ? 'true' : 'false') . "
"; // true echo "d is_numeric: " . (is_numeric($d) ? 'true' : 'false') . "
"; // false ?>

Temel Aritmetik İşlemler ve Operatörler

PHP, tüm temel aritmetik işlemleri destekler. Bu işlemler, matematiksel hesaplamalar yapmak için kullanılır.

  • Toplama (+): İki sayıyı toplar.
  • Çıkarma (-): Bir sayıdan diğerini çıkarır.
  • Çarpma (*): İki sayıyı çarpar.
  • Bölme (/): Bir sayıyı diğerine böler. Sonuç her zaman bir float olur, tam sayı olsa bile (örneğin 10/2 = 5.0).
  • Mod alma (%): Bölme işleminden kalanı verir. Sadece tam sayılar için geçerlidir.
  • Üs alma (): Bir sayının diğer bir sayının kuvvetini alır (PHP 5.6+).
";  // 13
echo "Çıkarma (x - y): " . ($x - $y) . "
"; // 7 echo "Çarpma (x y): " . ($x $y) . "
"; // 30 echo "Bölme (x / y): " . ($x / $y) . "
"; // 3.3333333333333 echo "Mod Alma (x % y): " . ($x % $y) . "
"; // 1 (10'un 3'e bölümünden kalan) echo "Üs Alma (x y): " . ($x $y) . "
"; // 1000 (10 üzeri 3) // Atama operatörleriyle birlikte kullanımı $sayac = 5; $sayac += 3; // $sayac = $sayac + 3; yani 8 echo "Sayac: " . $sayac . "
"; $fiyat = 100; $fiyat *= 1.20; // %20 zam echo "Yeni Fiyat: " . $fiyat . "
"; // 120 ?>

İşlem önceliği, matematikteki standart kurallara uyar (parantezler, üs alma, çarpma/bölme/mod alma, toplama/çıkarma). Parantezler kullanarak işlem sırasını değiştirebilirsiniz.

Sayısal Fonksiyonlar ve Biçimlendirme

PHP, sayılarla çalışmayı kolaylaştıran birçok yerleşik fonksiyona sahiptir.

Yuvarlama Fonksiyonları

  • round(float $number, int $precision = 0, int $mode = PHP_ROUND_HALF_UP): float: Bir sayıyı en yakın tam sayıya veya belirtilen ondalık basamağa yuvarlar.
  • ceil(float $number): float: Bir sayıyı her zaman yukarı (bir sonraki en büyük tam sayıya) yuvarlar.
  • floor(float $number): float: Bir sayıyı her zaman aşağı (bir önceki en küçük tam sayıya) yuvarlar.
";             // 3
echo "round(3.6): " . round($deger2) . "
"; // 4 echo "round(3.5): " . round($deger3) . "
"; // 4 (varsayılan: yarıyı yukarı yuvarla) echo "ceil(3.4): " . ceil($deger) . "
"; // 4 echo "floor(3.6): " . floor($deger2) . "
"; // 3 echo "round(3.14159, 2): " . round($deger4, 2) . "
"; // 3.14 ?>

Diğer Faydalı Fonksiyonlar

  • abs(mixed $number): number: Bir sayının mutlak değerini döndürür.
  • min(array|mixed ...$values): mixed: Bir dizi içindeki veya argüman olarak verilen en küçük değeri bulur.
  • max(array|mixed ...$values): mixed: Bir dizi içindeki veya argüman olarak verilen en büyük değeri bulur.
  • rand(int $min = 0, int $max = getrandmax()): int: Belirli bir aralıkta rastgele bir tam sayı üretir.
  • mt_rand(int $min = 0, int $max = mt_getrandmax()): int: rand()‘den daha hızlı ve daha iyi rastgele sayılar üreten Mersenne Twister algoritmasını kullanır. Genellikle tercih edilir.
"; // 10
echo "min(5, 2, 8): " . min(5, 2, 8) . "
"; // 2 echo "max([1, 9, 3]): " . max([1, 9, 3]) . "
"; // 9 echo "Rastgele sayı (1-100): " . mt_rand(1, 100) . "
"; ?>

Sayıları Biçimlendirme

Kullanıcılara gösterilecek sayıları okunabilir bir formata getirmek önemlidir. number_format() fonksiyonu bu iş için idealdir.

  • number_format(float $number, int $decimals = 0, string $decimal_separator = ".", string $thousands_separator = ","): string: Bir sayıyı binlik ayraçları ve ondalık basamakları ile biçimlendirir.
"; // 12,346 (yuvarlar)
echo "2 ondalık basamak: " . number_format($buyukFiyat, 2) . "
"; // 12,345.68 echo "Türkçe format: " . number_format($buyukFiyat, 2, ',', '.') . "
"; // 12.345,68 echo "Para birimi: " . number_format($buyukFiyat, 2, ',', '.') . " TL
"; // 12.345,68 TL ?>

Tip Dönüşümü

Bir değişkenin tipini açıkça sayısal bir tipe dönüştürmek için (int), (float) veya intval(), floatval() fonksiyonlarını kullanabilirsiniz.


Ondalıklı Sayılarla Çalışırken Dikkat Edilmesi Gerekenler ve Hassasiyet

Ondalıklı sayılarla çalışırken en önemli konulardan biri hassasiyet sorunlarıdır. Bilgisayarlar, ondalıklı sayıları ikili sistemde (binary) temsil eder ve bazı ondalık sayılar (örneğin 0.1), ikili sistemde tam olarak temsil edilemez. Bu durum, küçük yuvarlama hatalarına yol açabilir ve özellikle finansal uygulamalarda ciddi sorunlara neden olabilir.

Hassasiyet Kayıpları

"; // Çıktı: 0.7999999999999999
?>

Yukarıdaki örnekte görüldüğü gibi, basit bir toplama işlemi bile beklenmedik bir sonuç verebilir. Bu, float türündeki sayıların IEEE 754 standardına göre saklanmasından kaynaklanır.

Karşılaştırma Problemleri

Bu hassasiyet sorunları, ondalıklı sayıları doğrudan == operatörüyle karşılaştırırken de sorunlara yol açar.

";
} else {
    echo "Eşit değiller! (Beklenen)
"; // Bu çıktı alınır } ?>

Bu tür durumları çözmek için, sayıları doğrudan eşitlik yerine belirli bir “epsilon” (çok küçük bir tolerans değeri) kullanarak karşılaştırmak daha güvenlidir.

Finansal İşlemler ve Büyük Sayılar için BCMath ve GMP

Eğer yüksek hassasiyet gerektiren (örneğin finansal hesaplamalar) veya çok büyük tam sayılarla (standart integer limitlerini aşan) çalışmanız gerekiyorsa, PHP'nin yerleşik BCMath (Binary Calculator) veya GMP (GNU Multiple Precision) uzantılarını kullanmalısınız.

  • BCMath: Keyfi hassasiyette ondalıklı sayılarla işlem yapmanızı sağlar. Tüm işlemler dize (string) olarak yapılır, bu da hassasiyet kaybını önler. Fonksiyonlar genellikle bcadd(), bcsub(), bcmul(), bcdiv(), bcmod(), bcpow() şeklindedir ve bir hassasiyet (scale) parametresi alırlar.
  • GMP: Çok büyük tam sayılarla işlem yapmak için tasarlanmıştır. Integer limitlerini aşan sayılarla çalışmak için idealdir.
"; // Çıktı: 0.80

$fiyat1 = '123456789.12';
$fiyat2 = '987654321.98';
$toplamFiyat = bcadd($fiyat1, $fiyat2, 2);
echo "Büyük fiyatların toplamı: " . $toplamFiyat . "
"; // 1111111111.10 // GMP örneği (çok büyük tam sayılar için) // Eğer GMP yüklü değilse hata verir. if (extension_loaded('gmp')) { $buyukSayi1 = gmp_init("12345678901234567890"); $buyukSayi2 = gmp_init("98765432109876543210"); $toplamGMP = gmp_add($buyukSayi1, $buyukSayi2); echo "GMP ile büyük sayıların toplamı: " . gmp_strval($toplamGMP) . "
"; } else { echo "GMP uzantısı yüklü değil.
"; } ?>

Sonuç ve Sıkça Sorulan Sorular (SSS)

PHP'de sayılarla çalışmak, doğru araçları ve yaklaşımları bildiğinizde oldukça kolaydır. Tam sayılar ve ondalıklı sayılar arasındaki farkları anlamak, temel aritmetik operatörleri ve sayısal fonksiyonları kullanmak, çoğu senaryo için yeterlidir. Ancak, ondalıklı sayıların doğasında bulunan hassasiyet sorunlarını göz önünde bulundurmak ve finansal veya bilimsel hesaplamalar gibi kritik durumlarda BCMath veya GMP gibi uzantılara başvurmak hayati önem taşır.

Sıkça Sorulan Sorular (SSS)

S1: PHP'de bir sayının tam sayı mı yoksa ondalıklı sayı mı olduğunu nasıl anlarım?
C1: is_int() ve is_float() fonksiyonlarını kullanabilirsiniz. Ayrıca var_dump() fonksiyonu değişkenin tipini ve değerini detaylı olarak gösterir.

S2: Bir string'i sayıya dönüştürmenin en güvenli yolu nedir?
C2: Eğer bir string'in sadece sayısal bir değeri temsil ettiğinden eminseniz, (int) veya (float) tip dönüşümünü kullanabilirsiniz. intval() veya floatval() fonksiyonları da aynı işi yapar. Ancak, string'in gerçekten sayısal olup olmadığını kontrol etmek için öncelikle is_numeric() kullanmak iyi bir pratiktir.

S3: PHP'de rastgele sayı üretirken rand() yerine neden mt_rand() kullanmalıyım?
C3: mt_rand() fonksiyonu, Mersenne Twister algoritmasını kullanır ve rand()'den çok daha hızlıdır, ayrıca daha iyi kalitede (daha az tahmin edilebilir) rastgele sayılar üretir. Bu nedenle, genellikle mt_rand() tercih edilir.

S4: Finansal hesaplamalar yaparken PHP'de ondalıklı sayı hassasiyet sorunlarını nasıl önleyebilirim?
C4: Finansal veya yüksek hassasiyet gerektiren hesaplamalar için PHP'nin yerleşik BCMath uzantısını kullanmalısınız. bcadd(), bcsub(), bcmul() gibi fonksiyonlar, sayıları string olarak işleyerek istediğiniz hassasiyeti korumanıza olanak tanır.

S5: PHP'de çok büyük tam sayılarla çalışmak için ne yapmalıyım?
C5: PHP'nin standart int türü belirli bir limitin üzerinde sayıları tutamaz. Bu durumda, GMP (GNU Multiple Precision) uzantısını kullanmalısınız. GMP, keyfi büyüklükteki tam sayılarla işlem yapmanızı sağlar.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version