Yuvarlama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Tahsinzencir
Üye
Mesajlar: 48
Kayıt: 15 May 2009 12:16

Yuvarlama

Mesaj gönderen Tahsinzencir »

dostlar aşağıdaki 5 ve 6 begin bloku arasındaki Kodda Yuvarlamayı nasıl engellerim.
örneğin 50.80 ni 51 e yuvarlıyor. oysa kayıt işleminde 50.80 olarak kaydetmesini istiyorum.

Kod: Tümünü seç

procedure TFFatura.IKaydetClick(Sender: TObject);
var
   adet,i:Integer;
   toplam:Double;
1-begin
   if not assigned(FIrsaliye) then
2-begin
   FIrsaliye:=TFIrsaliye.Create(self);
   end
   else
   FIrsaliye.BringToFront;

   if  FIrsaliye.TIrsaliyeDurum.AsString=IRE.Text Then
   FIrsaliye.TIrsaliye.Filter:=''
   else
   FIrsaliye.TIrsaliye.Filter:='[IrNo]='+#39+IRE.text+'*'+#39;
   FIrsaliye.TIrsaliye.Filtered:=True;

   FIrsaliye.TIrsaliye.Edit;
   FIrsaliye.TIrsaliyeDurum.AsString:=E10.Text;
   FIrsaliye.TIrsaliye.Post;

3-begin
   TBagIrs.Refresh;
   TBagIrs.Append;

   if (TBagIrs.State <> dsEdit) and (TBagIrs.State <> dsInsert) then Exit;
   TBagIrsTarih.AsString:=E2.Text;
   TBagIrsVTarihi.AsString:=E3.Text;
   TBagIrsHTipi.AsString:=E7.Text;
   TBagIrsHTanim.AsString:=E4.Text;
   TBagIrsBSantiye.AsString:=E5.Text;
   TBagIrsHKod.AsString:=E8.Text;
   TBagIrsHarTip.AsString:=E9.Text;
   TBagIrsIrNo.AsString:=IRE.Text;
   TBagIrsMalNo.AsString:=E11.Text;
   TBagIrsMalzeme.AsString:=E12.Text;
   TBagIrsBirim.AsString:=E13.Text;
   TBagIrsMik.AsString:=E14.Text;
   TBagIrsBFiyat.AsString:=E15.Text;
   TBagIrsKDV.AsString:=E16.Text;
   TBagIrsKDVsizToplam.AsFloat:=strtofloat(E14.Text)*strtofloat(E15.Text);
   TBagIrsSToplam.AsFloat:=(strtofloat(E14.Text)*strtofloat(E15.Text)*strtofloat(E16.Text)/100)+(strtofloat(E14.Text)*strtofloat(E15.Text));
   TBagIrsKDVBFiyat.AsFloat:=(strtofloat(E14.Text)*strtofloat(E15.Text)*strtofloat(E16.Text)/100)/(strtofloat(E14.Text))+(strtofloat(E15.Text));
   TBagIrsKDVT.AsFloat:=strtofloat(E14.Text)*strtofloat(E15.Text)*strtofloat(E16.Text)/100;
   TBagIrs.Post;
   TBagIrs.Refresh;
   QFatura.Refresh;

4-begin
   QFatura.Close;
   QFatura.Open;
   if E19.Text=''  then
   QFatura.Filter:=''
   else
   QFatura.Filter:='[HTanim]='+#39+E19.text+'*'+#39;
   QFatura.Filtered:=True;

5-begin
   QFatura.Open;
   toplam:=0;
   adet:=StrToInt(Format('%2d',[yenigrid(DBGrid1).RowCount-1]));//satır sayısı
   QFatura.First;//ilk kayıda git
   for i:=1 to adet do
6-begin
   toplam:=toplam+DBGrid1.Fields[7].AsFloat;
   QFatura.Next;
   end;
   Lab.Text:=FloatToStrF(toplam,ffNumber,50,0);
   end;
    end;

   if  DMSProj.TSHareketHarTip.AsString=E1.Text then
   DMSProj.TSHareket.Filter:=''
   else
   DMSProj.TSHareket.Filter:='[Evrak]='+#39+E1.text+'*'+#39;
   DMSProj.TSHareket.Filtered:=True;

   DMSProj.TSHareket.Edit;
   DMSProj.TSHareketTutar.AsString:=Lab.Text;
   DMSProj.TSHareket.Post;
   end;
 end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Yuvarlama

Mesaj gönderen ertank »

Merhaba,

Kod içinde tanımlanan "toplam" değişkeni Double olarak tanımlanmış. Görebildiğim kadarıyla bu değişken değeri 50.80 olabilir. Örnek kod içinde bunu engelleyecek birşey göremedim.

Eğer sizin yuvarlama olarak ekranda gördüğünüz "Lab" bileşeni içindeki değer ise bunun sebebi kullandığınız "FloatToStrF" fonksiyonu kaynaklı. Eğer sorununuz bu ise ilgili satır kodunu aşağıdaki şekilde değiştirirseniz düzelecektir.

Kod: Tümünü seç

Lab.Text:=FloatToStrF(Toplam, ffNumber, 15, 28);
15 değeri noktadan sonraki hane sayısını belirtir. Ancak Bu değerin maksimum tanımı vardır. Parametre olarak verilen "Toplam" değişken türüne göre;
Single: Maksimum 7
Double: Maksimum 15
Extended: Maksimum 18
olabilir.

Siz 50 değerini verdiğiniz ve diğer parametreye (toplam rakam hane sayısı) sıfır değerini geçtiğiniz için ondalık kısmı gözardı ediliyor ve yuvarlama yaparak 51 değerini geriye çeviriyor. Yukarıdaki kod örneğinde ise "50.800000000000000" şeklinde bir değer çevirecektir. 15 rakamını azaltarak ondalıktan sonraki hane sayısını ayarlayabilirsiniz.
Tahsinzencir
Üye
Mesajlar: 48
Kayıt: 15 May 2009 12:16

Re: Yuvarlama

Mesaj gönderen Tahsinzencir »

Katkına teşekkürler ertank kardeş,
Lab.Text:=FloatToStrF(toplam,ffNumber,10,2); yapınca istediğim sonucu aldım.
Sizi meşgul ettiğim için hakkınızı helal edin lütfen
Cevapla