Yuvarlama Yapmasın...!
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Yuvarlama Yapmasın...!
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.
Teşekkür eder saygılar dilerim.
Re: Yuvarlama Yapmasın...!
ROUND yerine TRUNC kullanabililirsiniz:
http://www.firebirdsql.org/refdocs/lang ... trunc.html
http://www.firebirdsql.org/refdocs/lang ... trunc.html
Re: Yuvarlama Yapmasın...!
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.
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Yuvarlama Yapmasın...!
Ö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.
Saygıyla kalınız.
Re: Yuvarlama Yapmasın...!
Verdiğim bağlantı Firebird dökümanı idi. Komutu SQL içinde kullanabilirsiniz. gibi.
Kod: Tümünü seç
Select TRUNCT(tutar, 2) from tablo
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Yuvarlama Yapmasın...!
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.
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.
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;
Bu konuda deneyimli arkadaşlardan destek bekler saygılarımı iletirim.
-
- Üye
- Mesajlar: 839
- Kayıt: 03 Eki 2007 02:00
Re: Yuvarlama Yapmasın...!
benim fatura ekranı var belki çözüm olur erkle göstereyim erdogan_ozkaya@hotmail.com
Re: Yuvarlama Yapmasın...!
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/)
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/)
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Sorun Çözüldü...
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
kullanımı:
showmessage(GetSayiYuvarlamadanAl(deger,2)); // değer şu olsun... 36,78954..........36,78 olarak sonuç döncektir.
herkese saygılar dilerim.
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.
-
- Üye
- Mesajlar: 839
- Kayıt: 03 Eki 2007 02:00
Re: Yuvarlama Yapmasın...!
var
getal : real ;
AfgerondGetal :real;
begin
Getal:=strtofloat(Edit6.Text);
AfgerondGetal:=round(Getal*100)/100;
Edit6.Text:=floattostr(AfgerondGetal);
getal : real ;
AfgerondGetal :real;
begin
Getal:=strtofloat(Edit6.Text);
AfgerondGetal:=round(Getal*100)/100;
Edit6.Text:=floattostr(AfgerondGetal);
-
- Üye
- Mesajlar: 386
- Kayıt: 02 Tem 2007 09:43
Re: Yuvarlama Yapmasın...!
merhaba;
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.
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;
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.
Re: Yuvarlama Yapmasın...!
Merhaba,
Delphi son sürümlerinde FormatSettings.DecimalSeparator şeklinde tanımlanan bir global değişkendir. System.SysUtils içinde tanımlıdır.
Delphi son sürümlerinde FormatSettings.DecimalSeparator şeklinde tanımlanan bir global değişkendir. System.SysUtils içinde tanımlıdır.
-
- Üye
- Mesajlar: 386
- Kayıt: 02 Tem 2007 09:43
Re: Yuvarlama Yapmasın...!
çok teşekkür ederim.Delphi son sürümlerinde FormatSettings.DecimalSeparator şeklinde tanımlanan bir global değişkendir. System.SysUtils içinde tanımlıdır.
İsteyen, yapabildiğinden daha fazlasını yapar.