Merhabalar,
Bir fatura ekranim var, burada urunlerin karsisinda urun fiyatlari var. Ancak bunlar EKSI fiyatda olabiliyor.
Assagida ornek olarak yazdigim toplamlar aslinda urunlerin faturadaki fiyatlari, ancak urun fiyatlari sonradan EKSI olarak girilip fatura tutarinin SIFIR olmasi saglanmak istenmis. Fakat sonuc SIFIR olmayip, -2.66..... diye geliyor ?
dTutar : Double;
dTutar:=84 + 300 + 10.20 + 22 + 14 + 10.6 + 3.2 - 84 - 300 - 10.20 - 22 - 14 - 10.6 - 3.2;
Sorunu nasil asabiliriz ?
Tesekkur ederim.
* Detayli aciklama soyle;
Karpuz 84 ytl
Elma 300 ytl
Karpuz -84 ytl
Elma -300 ytl
gibi dusunurseniz, fatura toplaminin SIFIR olmasi lazim. Bende bunu for...next dongusu icinde "dToplamTutar:=dToplamTutar + dBirimFiyat" seklinde topluyorum. Fakat netice SIFIR gelmiyor. Yukarida yazdigim "dTutar:=84 +300 + 10.2 ............ " ornegini kullanabilirsiniz.
Toplama isleminde hata aliyorum ?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Toplama isleminde hata aliyorum ?
aklıma ilk gelen döngünün adımlarının eksik verilmiş olması...
kodu yazarsanız daha da netleşir...
kodu yazarsanız daha da netleşir...
bazen yükselmek için önce dibi görmek gerekir...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Re: Toplama isleminde hata aliyorum ?
s.a.
aklıma iki ihtimal geliyor.
birincisi birim fiyatını toplamışsını ama üründen iki adet varsa bu farka neden olabilir.
ikincisi küsüratlar ve yuvarlamadan dolayı yapabilir.
Tabiki kodlarda bi problem yoksa.
kolay gelsin.
aklıma iki ihtimal geliyor.
birincisi birim fiyatını toplamışsını ama üründen iki adet varsa bu farka neden olabilir.
ikincisi küsüratlar ve yuvarlamadan dolayı yapabilir.
Tabiki kodlarda bi problem yoksa.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: Toplama isleminde hata aliyorum ?
Bence de ondalık olarak 2 hane gösteriyorsun ama işlem yaparken ondalıklaraslangeri yazdı:s.a. ikincisi küsüratlar ve yuvarlamadan dolayı yapabilir.
10.556621 gibi olabilir.
Bir kelimenin anlamını öğretsen bile yeter..



- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Toplama isleminde hata aliyorum ?
Bu gün bu soruya 2. cevap yazışım
. ile ben 2,66713734431434E-17 sayısını elde ettim. Bunun anlamı ise 2,6671373443143/100.000.000.000.000.000 dir. Yani yaklaşık iki buçuk bölü on nonilyon (2,66/(10 üssü 17) dur. Bu sayı ise resmen sıfırın ta kendisi olsa gerek. Çünkü sayının milyar kere milyara bölünmesi ihmal edilebilecek bir değerdir. Bu işlemin sıfır değeri vermemesinin sebebi ise bilgisayarın tüm işlemleri ikilik sayı sistemi ile gerçekleştirmeleridir ve ondalık sayıları hatasız ve mükemmel olarak ikilik karşılığını elde etmek için sonsuz büyüklükte bir ram kapasitesine ihtiyaç vardır. Bu kapasitede işlem yapmak içinde sonsuz hızlı bir işlemci gerekiyor. Her ikisi de mümkün olmadığından sayıların ikilik karşılığını elde etmedeki kayıplar ya da ihmaller sonucu sıfır olmayan ama neredeyse sıfıra yakın bu değeri elde etmektesiniz.

Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var dTutar : Double;
begin
dTutar:=84 + 300 + 10.20 + 22 + 14 + 10.6 + 3.2 - 84 - 300 - 10.20 - 22 - 14 - 10.6 - 3.2;
Edit1.Text:=FloatToStr(dTutar);
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Toplama isleminde hata aliyorum ?
Floating point hatalarından korunmak için kodlama yaparken Double, extended gibi veritiplerinden kaçınmak gerekir. Currency veritipi bu iş için en iyisi. Currency'de virgülden sonraki 4 basamak tan ötesi göz ardı edilir. Buda para tipleri için oldukça yeterli bir precision dur.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Toplama isleminde hata aliyorum ?
Hakikaten de Double yerine Currency tipi yapınca sonuç sıfır çıktı
.

Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .