Şimdi Ara

PHP Hata -0 Değeri

Bu Konudaki Kullanıcılar:
2 Misafir - 2 Masaüstü
5 sn
9
Cevap
0
Favori
617
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar,

    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.



  • Merhaba,
    Siz echo number_format($genel_borcu,2,',','.'); yazmakla sayıyı para birimi formatında görüntülemek istiyorsunuz. Bunu yaparken 1 kuruştan daha küçük miktar kayboluyor. Negatif bir sonuç çıkıyor ama sonuç 1 kuruştan küçük olduğu için hesaba girmiyor. Onun için -0,00 yazıyor.

    Örnek;

     
    <?php
    $a = 10.002;
    $b = 10.007;
    $genel_borcu = $a - $b;
    echo number_format($genel_borcu,2,',','.');
    ?>


    Sonuç: -0,00

    Başka örnek;

    echo number_format(-0.004,2,',','.');

    Bunun da Sonucu: -0,00

    Böyle olup olmadığından emin olmak istiyorsanız. number_format() fonksiyonu kullanmadan sonucu echo $genel_borcu şeklinde yazdırın çıktıyı görün. Sonuç negatif ama 1 kuruştan daha az bir miktarsa benim dediklerim doğru demektir. Hatta number_format() fonksiyonu sayıları yuvarlayarak 1 kuruşa tamamlayabiliyor böyle durumda -0,01 yazıyor.

    Örneğin; -0.008 bir kuruştan bile küçüktür ama yuvarlayarak -0,01 yazar.

    echo number_format(-0.008,2,',','.');

    Yuvarlama işini sayı pozitif iken de yapar. Mesela 15.007

    echo number_format(15.007,2,',','.');

    Sonuç: 15,01 verir. Aslında bu 15,01 etmez ama yuvarlayarak 15,01 yazar.

    Falan filan işte... Neyse boş yere uzatmayalım.

    Bu kadar yazdım. İnşallah bir faydası olur.

    Kolay gelsin.
  • quote:

    Orijinalden alıntı: DoubleDragon

    Merhaba,
    Siz echo number_format($genel_borcu,2,',','.'); yazmakla sayıyı para birimi formatında görüntülemek istiyorsunuz. Bunu yaparken 1 kuruştan daha küçük miktar kayboluyor. Negatif bir sonuç çıkıyor ama sonuç 1 kuruştan küçük olduğu için hesaba girmiyor. Onun için -0,00 yazıyor.

    Örnek;

     
    <?php
    $a = 10.002;
    $b = 10.007;
    $genel_borcu = $a - $b;
    echo number_format($genel_borcu,2,',','.');
    ?>


    Sonuç: -0,00

    Başka örnek;

    echo number_format(-0.004,2,',','.');

    Bunun da Sonucu: -0,00

    Böyle olup olmadığından emin olmak istiyorsanız. number_format() fonksiyonu kullanmadan sonucu echo $genel_borcu şeklinde yazdırın çıktıyı görün. Sonuç negatif ama 1 kuruştan daha az bir miktarsa benim dediklerim doğru demektir. Hatta number_format() fonksiyonu sayıları yuvarlayarak 1 kuruşa tamamlayabiliyor böyle durumda -0,01 yazıyor.

    Örneğin; -0.008 bir kuruştan bile küçüktür ama yuvarlayarak -0,01 yazar.

    echo number_format(-0.008,2,',','.');

    Yuvarlama işini sayı pozitif iken de yapar. Mesela 15.007

    echo number_format(15.007,2,',','.');

    Sonuç: 15,01 verir. Aslında bu 15,01 etmez ama yuvarlayarak 15,01 yazar.

    Falan filan işte... Neyse boş yere uzatmayalım.

    Bu kadar yazdım. İnşallah bir faydası olur.

    Kolay gelsin.

    Merhabalar,

    Maalesef dediğiniz gibi de yaptım number_format kaldırdım sonuç değişmedi.
  • valid20 kullanıcısına yanıt
    Mesela aşağıdaki işlemlerin sonucunu

    (0.00+255.60+298.45+2137.88+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00)-(2500.00+ 191.93)=-0,00
    (0.00+839.95+980.74+4704.93+0.00+0.00+0.00+0.00+974.38+0.00+0.00+0.00+0.00)-(7500.00+ 0.00)=-0,00
    (0.00+318.30+371.65+1782.91+0.00+0.00+0.00+0.00+1211.63+15.51+0.00+0.00+0.00)-(3700.00+ 0.00)=-0,00
    (0.00+207.97+1187.72+1758.68+0.00+0.00+0.00+0.00+1699.48+2630.54+0.00+0.00+0.00)-(3700.00+ 3784.39)=-0,00
    (0.00+681.75+796.03+8395.04+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00)-(7500.00+ 2372.82)=-0,00

    olarak veriyor. Yaklaşık 500 veri içinde bir kaç tanesi böyle problemli.
  • valid20 kullanıcısına yanıt
    Öyleyse kodlarınızda şunu yapın;

    $genel_borcu =($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme);

    yazdığınız yerde şu şekilde kullanarak

    $genel_borcu = round(($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme),4);

    sıkıntıyı giderin. Sonucu bizimle paylaşın.
  • quote:

    Orijinalden alıntı: DoubleDragon

    Öyleyse kodlarınızda şunu yapın;

    $genel_borcu =($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme);

    yazdığınız yerde şu şekilde kullanarak

    $genel_borcu = round(($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme),4);

    sıkıntıyı giderin. Sonucu bizimle paylaşın.

    Yuvarlayarak çözebileceğimi biliyorum ama bu çözüm değil, önemli olan neden böyle bir hata alıyorum ?



    < Bu mesaj bu kişi tarafından değiştirildi valid20 -- 19 Aralık 2017; 10:43:37 >
  • quote:

    Orijinalden alıntı: valid20


    quote:

    Orijinalden alıntı: DoubleDragon

    Öyleyse kodlarınızda şunu yapın;

    $genel_borcu =($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme);

    yazdığınız yerde şu şekilde kullanarak

    $genel_borcu = round(($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme),4);

    sıkıntıyı giderin. Sonucu bizimle paylaşın.

    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;

     
    <?php
    $x = 8 - 6.4; // Bu işlemin sonucu 1.6 dır.

    $y = 1.6;

    if($x == $y){
    echo "Doğru";
    }else{
    echo "Yanlış";
    }
    ?>

    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.

    (0.00+255.60+298.45+2137.88+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00)-(2500.00+ 191.93)=4.5474735088646E-13
    (0.00+839.95+980.74+4704.93+0.00+0.00+0.00+0.00+974.38+0.00+0.00+0.00+0.00)-(7500.00+ 0.00)=9.0949470177293E-13
    (0.00+318.30+371.65+1782.91+0.00+0.00+0.00+0.00+1211.63+15.51+0.00+0.00+0.00)-(3700.00+ 0.00)=4.5474735088646E-13
    (0.00+207.97+1187.72+1758.68+0.00+0.00+0.00+0.00+1699.48+2630.54+0.00+0.00+0.00)-(3700.00+ 3784.39)=9.0949470177293E-13
    (0.00+681.75+796.03+8395.04+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00)-(7500.00+ 2372.82)=1.8189894035459E-12

    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.
  • quote:

    Orijinalden alıntı: DoubleDragon


    quote:

    Orijinalden alıntı: valid20


    quote:

    Orijinalden alıntı: DoubleDragon

    Öyleyse kodlarınızda şunu yapın;

    $genel_borcu =($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme);

    yazdığınız yerde şu şekilde kullanarak

    $genel_borcu = round(($buyilinaidati+$oncekiyilborcu)-($toplamyaptigiodeme),4);

    sıkıntıyı giderin. Sonucu bizimle paylaşın.

    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;

     
    <?php
    $x = 8 - 6.4; // Bu işlemin sonucu 1.6 dır.

    $y = 1.6;

    if($x == $y){
    echo "Doğru";
    }else{
    echo "Yanlış";
    }
    ?>

    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.

    (0.00+255.60+298.45+2137.88+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00)-(2500.00+ 191.93)=4.5474735088646E-13
    (0.00+839.95+980.74+4704.93+0.00+0.00+0.00+0.00+974.38+0.00+0.00+0.00+0.00)-(7500.00+ 0.00)=9.0949470177293E-13
    (0.00+318.30+371.65+1782.91+0.00+0.00+0.00+0.00+1211.63+15.51+0.00+0.00+0.00)-(3700.00+ 0.00)=4.5474735088646E-13
    (0.00+207.97+1187.72+1758.68+0.00+0.00+0.00+0.00+1699.48+2630.54+0.00+0.00+0.00)-(3700.00+ 3784.39)=9.0949470177293E-13
    (0.00+681.75+796.03+8395.04+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00+0.00)-(7500.00+ 2372.82)=1.8189894035459E-12

    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.

    Teşekkür ederim aradığım cevap buydu.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.