Toplama isleminde hata aliyorum ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
asking
Üye
Mesajlar: 11
Kayıt: 07 Mar 2008 08:06

Toplama isleminde hata aliyorum ?

Mesaj gönderen asking »

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.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Toplama isleminde hata aliyorum ?

Mesaj gönderen unicorn64 »

aklıma ilk gelen döngünün adımlarının eksik verilmiş olması...
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...

Resim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Toplama isleminde hata aliyorum ?

Mesaj gönderen aslangeri »

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.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Toplama isleminde hata aliyorum ?

Mesaj gönderen conari »

aslangeri yazdı:s.a. ikincisi küsüratlar ve yuvarlamadan dolayı yapabilir.
Bence de ondalık olarak 2 hane gösteriyorsun ama işlem yaparken ondalıklar
10.556621 gibi olabilir.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
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 ?

Mesaj gönderen sabanakman »

Bu gün bu soruya 2. cevap yazışım :wink: .

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;
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.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: Toplama isleminde hata aliyorum ?

Mesaj gönderen undefined »

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.
Kullanıcı avatarı
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 ?

Mesaj gönderen sabanakman »

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