Yuvarlayarak çözebileceğimi biliyorum ama bu çözüm değil, önemli olan neden böyle bir hata alıyorum ?
Bu problem float sayıların bilgisayarda saklanması ve işlem yapılmasıyla ilgili bir problem. Bilgisayar sayıları 2 tabanına çeviriyor ve işlem yapıyor. Tam sayıları çevirirken iyi de float sayıları çevirirken problem çıkıyor. Tam olarak çeviremiyor. Belli bir hata barındırıyor.
Örneğin;
<?php $x = 8 - 6.4; // Bu işlemin sonucu 1.6 dır. $y = 1.6; $z = $x - $y; // 1.6'dan 1.6 çıkarsa kaç kalır? echo $z; ?>
Yukarıdaki işlemin sonucunda ekrana kaç yazar? Sıfır yazmasını bekleriz ama yazmaz. Ben denedim -4.4408920985006E-16 yazıyor. Bu bu işlemi biz kağıt kalemle çok kolay şekilde yaparız. Ama yukarıda bahsettiğim sebepten dolayı sonucu yanlış söylüyor.
Float sayıların karşılaştırmasını da doğru yapamıyor örneğin;
Yukarıdaki if karşılaştırmasının sonucu "Doğru" olması gerekirken "Yanlış" çıkıyor. Bu sebeple karşılaştırma işlemlerinde float kullanmak sağlıklı değildir.
Sizin -0,00 görünmesi meselesine dönersek; bilgisayar -0,00 şeklinde görülen işlemlerin hiç birini yukarıdaki nedenlerden dolayı sıfır olarak hesaplayamamış.
Bu işlemlerin sonucunu echo ile yazdıracak olursak şöyle göründüğünü görürüz.
Görüldüğü gibi sonuçlar milyarda 1'den bile küçük ama yine de sıfır değil. Sizin durumunuzda PHP'deki round() fonksiyonu kullanılarak sayıyı yuvarlayarak sonuçları istediğimiz şekilde doğrultabiliriz. Bu fonksiyon hakkında ayrıntılı bilgi için şuraya bakabilirsiniz.
PHP'de float sayılar konusu ile ilgili ayrıntılı bilgi istiyorsanız http://php.net float konusuna bakabilirsiniz.
Eğer hesaplarda yüksek hassasiyet gerekiyorsa BC Math İşlevleri kullanılması tavsiye ediliyor. float sayıları virgülden sonra kaç basamak hassasiyet gerekiyorsa bunu da ayarlayabiliyorsunuz.
Yuvarlayarak çözebileceğimi biliyorum ama bu çözüm değil, önemli olan neden böyle bir hata alıyorum ?
Bu problem float sayıların bilgisayarda saklanması ve işlem yapılmasıyla ilgili bir problem. Bilgisayar sayıları 2 tabanına çeviriyor ve işlem yapıyor. Tam sayıları çevirirken iyi de float sayıları çevirirken problem çıkıyor. Tam olarak çeviremiyor. Belli bir hata barındırıyor.
Örneğin;
<?php $x = 8 - 6.4; // Bu işlemin sonucu 1.6 dır. $y = 1.6; $z = $x - $y; // 1.6'dan 1.6 çıkarsa kaç kalır? echo $z; ?>
Yukarıdaki işlemin sonucunda ekrana kaç yazar? Sıfır yazmasını bekleriz ama yazmaz. Ben denedim -4.4408920985006E-16 yazıyor. Bu bu işlemi biz kağıt kalemle çok kolay şekilde yaparız. Ama yukarıda bahsettiğim sebepten dolayı sonucu yanlış söylüyor.
Float sayıların karşılaştırmasını da doğru yapamıyor örneğin;
Yukarıdaki if karşılaştırmasının sonucu "Doğru" olması gerekirken "Yanlış" çıkıyor. Bu sebeple karşılaştırma işlemlerinde float kullanmak sağlıklı değildir.
Sizin -0,00 görünmesi meselesine dönersek; bilgisayar -0,00 şeklinde görülen işlemlerin hiç birini yukarıdaki nedenlerden dolayı sıfır olarak hesaplayamamış.
Bu işlemlerin sonucunu echo ile yazdıracak olursak şöyle göründüğünü görürüz.
Görüldüğü gibi sonuçlar milyarda 1'den bile küçük ama yine de sıfır değil. Sizin durumunuzda PHP'deki round() fonksiyonu kullanılarak sayıyı yuvarlayarak sonuçları istediğimiz şekilde doğrultabiliriz. Bu fonksiyon hakkında ayrıntılı bilgi için şuraya bakabilirsiniz.
PHP'de float sayılar konusu ile ilgili ayrıntılı bilgi istiyorsanız http://php.net float konusuna bakabilirsiniz.
Eğer hesaplarda yüksek hassasiyet gerekiyorsa BC Math İşlevleri kullanılması tavsiye ediliyor. float sayıları virgülden sonra kaç basamak hassasiyet gerekiyorsa bunu da ayarlayabiliyorsunuz.
while döngüsü ile db her ayın ödemelerini çekip toplatıyorum
$toplamyaptigiodeme =$havale+$kasim+$aralik+$ocak+$subat+$mart+$nisan+$mayis+$haziran+$temmuz+$agustos+$eylul+$ekim;
sonra bu yılın aidatı ve önceki yıl borcunu toplayıp aylık yaptığı ödemelerden çıkarıyorum
$genel_borcu =($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme);
sonrada bunu döngü içinde yazdırıyorum.
echo number_format($genel_borcu,2,',','.');
Liste olarak dökümanı aldığımda mesala bazı değerler 0 iken bazıları -0 görünüyor. Neden -0 göründüğünü çözemedim.
Db verileri decimal.
Şimdiden herkese teşekkür ederim.
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.