Arama butonu
Bu konudaki kullanıcılar: 1 misafir
7
Cevap
981
Tıklama
0
Öne Çıkarma
PHP Hata -0 Değeri
V
8 yıl
Teğmen
Konu Sahibi

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.



D
8 yıl
Yarbay

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.


Bu mesaja 1 cevap geldi.
V
8 yıl
Teğmen
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.
V
8 yıl
Teğmen
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @valid20
D
8 yıl
Yarbay

Ö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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @valid20
V
8 yıl
Teğmen
Konu Sahibi

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 >
Bu mesaja 1 cevap geldi.
D
8 yıl
Yarbay

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.


Bu mesaja 1 cevap geldi.
V
8 yıl
Teğmen
Konu Sahibi

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.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.