Yuvarlama Yapmasın...!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Yuvarlama Yapmasın...!

Mesaj gönderen baloglurecep »

Arkadaşlar selamlar.... Genelde yuvarlama ile ilgili bir çok konu ve açılmış konu var. Hepsinin içeriği yuvarlama nasıl olmalı nasıl yapılmalı yanlış yöntemler vs. Ben yaptığım işlemde çarpma,bölme kullanıyorum ( kdv ve iskonto hesaplama) ancak virgülden sonraki sadece ilk 2 haneyi olduğu gibi ne aşağı ne yukarı yuvarlamadan almak istiyorum. Ancak alamıyorum. İşlem sonucu virgülden sonra 2den fazla olduğu durumlarda virgül sonrası 3.haneye bakarak yuvarlama yapıyor. Bunun olmaması için yöntem var mıdır? firebird 2.0 veri tabanı kullanıyorum ve parasal alanım virgülden sonra 2 hane şeklinde tanımlı. Bu işlemi veri tabanı yapıyor olabilir mi? Eğer öyleyse çözüm nasıl olmalı? Örneğin 64,7671 rakamını 64,76 olarak alabilmeliyim 64,77 değil.

Teşekkür eder saygılar dilerim.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Yuvarlama Yapmasın...!

Mesaj gönderen mkysoft »

ROUND yerine TRUNC kullanabililirsiniz:
http://www.firebirdsql.org/refdocs/lang ... trunc.html
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Yuvarlama Yapmasın...!

Mesaj gönderen Battosai »

veritabanında ondalık değer 2 hane ise yuvarlama mecburen yapılır. Parasal değerler ile çalışırken küsüratı kendiniz belirlemelisiniz. Yani veritabanına değer gönderilirken ondalık hane 2 basamak olmalı. Bu şekilde yaparsanız küsüratlardan dolayı yanlış hesap ortaya çıkmaz.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Yuvarlama Yapmasın...!

Mesaj gönderen baloglurecep »

Öncelikle cevap veren arkadaşlara teşekkürlerimi iletiyorum. Yalnız trunc fonksiyonun delphi üzerinden nasıl kullanılacağı konusunda bilgi sahibi değilim. Bu konuda mkysfot arkadaşım biraz daha açıklamalı yada örnek içeren cevap verebilirse çok sevinirim. Direk veri tabanı üzerinde mi yoksa delphi üzerinde mi kullancağız bu fonksiyonu?

Saygıyla kalınız.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Yuvarlama Yapmasın...!

Mesaj gönderen mkysoft »

Verdiğim bağlantı Firebird dökümanı idi. Komutu SQL içinde kullanabilirsiniz.

Kod: Tümünü seç

Select TRUNCT(tutar, 2) from tablo
gibi.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Yuvarlama Yapmasın...!

Mesaj gönderen baloglurecep »

selamlar tekrar... verdiğiniz bilgileri kullandım. Ancak çözüm üretemedim. hata verdi sanırım firebird 2.0 versiyonda bu fonksiyon çalışmıyor, desteklenmiyor. Bu işlemi kod ile nasıl yapabilirim. simpleroundto kullandım o da çözüm olmadı.

Kodlarım şu şekilde.

Kod: Tümünü seç

WHILE NOT(dm.fatura_query.Eof) DO
      BEGIN
      dm.fatura_query.Edit;
      DM.fatura_queryMIKTAR.AsCurrency:=DM.fatura_queryILK_FIYAT.AsCurrency / (1 + (DM.fatura_queryKDV.AsInteger / 100));
      dm.fatura_queryTOPLAM.AsCurrency:= DM.fatura_queryMIKTAR.AsCurrency * DM.fatura_queryADET.AsCurrency;
      ISKONTO_TUTAR:=(dm.fatura_queryTOPLAM.AsCurrency / 100 * DM.fatura_queryISKONTO.AsInteger);
      DM.fatura_queryISKONTO_TUTARI.AsCurrency:=(ISKONTO_TUTAR);// * DM.fatura_queryADET.AsCurrency;
      KDV_TUTAR:=(dm.fatura_queryTOPLAM.AsCurrency - ISKONTO_TUTAR ) / 100 * DM.fatura_queryKDV.AsInteger;
      DM.fatura_queryKDV_TUTARI.AsCurrency:=(KDV_TUTAR);// * DM.fatura_queryADET.AsCurrency;
      dm.fatura_queryFATURA_TOPLAM.AsCurrency:=(dm.fatura_queryTOPLAM.AsCurrency - ISKONTO_TUTAR + KDV_TUTAR) ;//* DM.fatura_queryADET.AsCurrency;
      dm.fatura_query.Post;
      dm.fatura_query.Next;
      END;
Fatura tablosundaki alanları kullanıcı değişim sonrasında bu kodlarla tekrar editliyorum. Özellikle kdv ve iskonto hesaplamasında virgülden sonra 2 den fazla hane olursa yuvarlama işlemi oluyor ve satış tutarını tutmuyor. (kuruş farkları oluşuyor).
Bu konuda deneyimli arkadaşlardan destek bekler saygılarımı iletirim.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: Yuvarlama Yapmasın...!

Mesaj gönderen erdogan_ozkaya »

benim fatura ekranı var belki çözüm olur erkle göstereyim erdogan_ozkaya@hotmail.com
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Yuvarlama Yapmasın...!

Mesaj gönderen csunguray »

Kod: Tümünü seç

var
  Sayi1: Double;
begin
  Sayi1 := 64.7671;
  Sayi1 := Trunc(Sayi1 * 100) / 100;
end;
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Sorun Çözüldü...

Mesaj gönderen baloglurecep »

Arkadaşlar cevap veren vermeyen herkese teşekkürler... Sorun bir dostumun yardımıyla çözüldü.Fesih komserime teşekkürlerimi sunuyorum buradan. Bazen çok basit çözümleri göremiyoruz. Elimizdeki gözlüğü aramak gibi arıyor duruyoruz.... Sanırım yaşlandık yada iştah kalmadı... Basit bir fonksiyonla işlemi hallettik. değerin önce tam sayı kısmını, sonra decimal kısmı alıyoruz. tam sayı+decimal sparattör+decimal hanelerinden de copy metodu ile 2 hane alıyoruz. Bu şekilde işlem çözüldü.

Lazım olan olursa fikir olması açısından

Kod: Tümünü seç

function GetSayiYuvarlamadanAl(Sayi: Currency; DecimalHaneSayisi: Integer): string;
var
SayiTamKismi: Int64;
SayiDecimalKismi: Real;

begin

  SayiTamKismi := Trunc(Sayi);

  SayiDecimalKismi := Frac(Sayi);

  Result := IntToStr(SayiTamKismi) + DecimalSeparator + Copy(FloatToStr(SayiDecimalKismi), 3, DecimalHaneSayisi);

end;

kullanımı:

showmessage(GetSayiYuvarlamadanAl(deger,2)); // değer şu olsun... 36,78954..........36,78 olarak sonuç döncektir.


herkese saygılar dilerim.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: Yuvarlama Yapmasın...!

Mesaj gönderen erdogan_ozkaya »

var
getal : real ;
AfgerondGetal :real;
begin
Getal:=strtofloat(Edit6.Text);
AfgerondGetal:=round(Getal*100)/100;
Edit6.Text:=floattostr(AfgerondGetal);
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: Yuvarlama Yapmasın...!

Mesaj gönderen akuyumcu63 »

merhaba;

Kod: Tümünü seç

function GetSayiYuvarlamadanAl(Sayi: Currency; DecimalHaneSayisi: Integer): string;
var
  SayiTamKismi     :Int64;
  SayiDecimalKismi :Real;
  DecimalSeparator :String;
begin
  DecimalSeparator:=',';
  SayiTamKismi := Trunc(Sayi);
  SayiDecimalKismi := Frac(Sayi);
  Result := IntToStr(SayiTamKismi) + DecimalSeparator + Copy(FloatToStr(SayiDecimalKismi), 3, DecimalHaneSayisi);
end;
fonksiyonda DecimalSeparator tanımlanamayan Değişken hatası veriyor. kullanılması gereken bir unit mi var ? delphi XE6 kullanıyorum.
geçici bir çözüm buldum. DecimalSeparator isminde string bir değişken tanımladım. bunada virgül(,) değerini atadım oldu. Ancak sistemin ondalık ayracı virgül(,) değilde nokta (.) olduğu zaman hatalı değer üretecektir.
DecimalSeparator ifadesi sistemin ondalık ayracını bir yerden okumalı diye düşünüyorum. bu konuda yardımcı olursanız memnun olurum

Teşekkür ederim.
İsteyen, yapabildiğinden daha fazlasını yapar.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Yuvarlama Yapmasın...!

Mesaj gönderen ertank »

Merhaba,

Delphi son sürümlerinde FormatSettings.DecimalSeparator şeklinde tanımlanan bir global değişkendir. System.SysUtils içinde tanımlıdır.
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: Yuvarlama Yapmasın...!

Mesaj gönderen akuyumcu63 »

Delphi son sürümlerinde FormatSettings.DecimalSeparator şeklinde tanımlanan bir global değişkendir. System.SysUtils içinde tanımlıdır.
çok teşekkür ederim.
İsteyen, yapabildiğinden daha fazlasını yapar.
Cevapla