float

Gerçek sayılar (veya kayan noktalı sayılar) şu sözdizimleri ile belirtilebilir:

<?php
$a 
1.234;
$b 1.2e3;
$c 7E-10;
?>

Biçimsel olarak:

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
USTEL_DNUM    [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

Bir gerçek sayının bellekte kapladığı genişlik platforma göre değişmekteyse de kabaca 14 hanelik bir hassasiyetle 1.8e308'lik olası bir en büyük değer (64 bitlik IEEE biçemi) hepsi için sağlanır.

Uyarı

Kayan nokta hassasiyeti

Kayan noktalı sayılar sınırlı bir hassasiyete sahiptir. Sisteme bağımlı olmakla birlikte PHP normalde (1.11e-16'lık bir yuvarlamadan dolayı görece en büyük hatayı verecek olan) IEEE 754 çift hassasiyetli biçimi kullanır. 4 temel işlemden daha karmaşık aritmetik işlemler daha büyük hatalar verebilir, dolayısıyla işlemler karmaşık hale gelmeye başlayınca hatanın açıklanması bir önkabul olarak ele alınmalıdır.

Ek olarak, 0.1 veya 0.7 gibi 10 tabanında kayan noktalı sayılar olarak tamamiyle gösterilebilen gerçel sayılar, 2 tabanında kayan noktalı sayılar olarak tamamiyle gösterilemezler. Bu bakımdan, az da olsa bir kayıp olmaksızın dahili ikil karşılıklarına dönüştürülemezler. Bunun şöyle bir sonucu olur: örneğin, floor((0.1+0.7)*10) işlevinden beklendiği gibi 8 değil, 7 döner; bunun sebebi dahili gösterimin aslında 7.9999999999999991118... gibi bir değer olmasıdır.

Bu bakımdan, son ondalık hanesine bakarak sonucun ne olacağına karar verilemez, bu bakımdan kayan noktalı sayılar arasında asla eşitlik karşılaştırmaları yapılmaz. Eğer daha yüksek hassasiyet isteniyorsa keyfi hassasiyetli matematik işlevleri ve gmp işlevleri kullanılabilir.

"Basit" bir açıklama için » kayan noktalı sayılar kılavuzuna bakınız.

float türüne dönüşüm

string türleri float türlere dönüştürmek için gereken bilgileri Dizgelerin sayılara dönüşümü bölümünde bulabilirsiniz. Diğer türlerden float türüne dönüşüm için değer önce integer türüne dönüştürülür. Daha fazla bilgi için integer türüne dönüşüm bölümüne bakınız. PHP 5 itibariyle, bir object tür float türe dönüştürülmeye çalışılırsa bir uyarı üretilir.

Kayan noktalı sayıların karşılaştırılması

Yukarıdaki uyarıda kısaca değinildiği gibi kayan noktalı sayılar arasında eşitlik karşılaştırmaları, bunların dahili gösterimlerinden dolayı biraz sorunludur. Bununla birlikte, bu sınırlamaların aşılmasını ve kayan noktalı sayılar arasında karşılaştırma yapılmasını sağlayan yollar vardır.

Kayan noktalı değerlerin eşitliğini sınamak için yuvarlamadan dolayı ortaya çıkan göreli hatanın bir üst sınırı kullanılır. Bu değer makine epsilonu veya yuvarlama birimi olarak bilinir ve hesaplamalardaki kabul edilebilir en küçük farktır.

$a ve $b 5 haneli hassasiyetle eşittir.

<?php
$a 
1.23456789;
$b 1.23456780;
$epsilon 0.00001;

if(
abs($a-$b) < $epsilon) {
    echo 
"doğru";
}
?>

NaN

Bazı sayısal işlemler NAN sabiti ile gösterilen bir değerle sonuçlanabilir. Bu sonuç, kayan noktalı hesaplamalarda tanımlanamayan veya gösterilemeyen bir değeri gösterir. Bu değerin, kendisi dahil herhangi bir değerle gevşek ya da sıkı bir karşılaştırması FALSE sonucuna sebep olur.

NAN farklı değerdeki herhangi bir sayıyı temsil ettiğinden kendisi dahil fakat TRUE hariç, başka bir değerle karşılaştırılmamalı, bunun yerine değer is_nan() ile sınanmalıdır.