roundto fonksiyonu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
edoyuko
Üye
Mesajlar: 24
Kayıt: 28 Ara 2006 01:29

roundto fonksiyonu

Mesaj gönderen edoyuko »

s.a. arkadaşlar,

showmessage(floattostr(roundto(1001.355,-2)); kodu 1001.36
showmessage(floattostr(roundto(1001.365,-2)); kodu 1001.37
showmessage(floattostr(roundto(1001.375,-2)); kodu 1001.38
AMA.........
showmessage(floattostr(roundto(1001.385,-2)); kodu 1001.39 döndürmeliyken 1001.38
showmessage(floattostr(roundto(1001.395,-2)); kodu 1001.40 döndürmeliyken 1001.39 döndürüyor..
NEDEN?

yardımlarınız için şimdiden teşekkür ederim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: roundto fonksiyonu

Mesaj gönderen aslangeri »

s.a.
kullandığın delphinin versiyonunu söylersen daha iyi olur kanısıdayım.
ben d6 ve 2006 da denedim.
sonuçlar
sırası ile 35,36,37,38,39
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
edoyuko
Üye
Mesajlar: 24
Kayıt: 28 Ara 2006 01:29

Re: roundto fonksiyonu

Mesaj gönderen edoyuko »

a.s.
d7 kullanıyorum.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: roundto fonksiyonu

Mesaj gönderen Hakan Can »

Roundto'nun helpine bakarsanız orada “Banker’s Rounding” diye açıklıyor nedenini.

İyi çalışmalar.
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

Re: roundto fonksiyonu

Mesaj gönderen TRSoft »

Merhabalar

Aslına bakarsanız hem @Hakan Can arkadaşımızın hemde @aslangeri arkadaşımızın dedikleride doğru.

Bu olay benim başımada gelmişti. İki ayrı sistemde iki ayrı sonuç elde ediyorduk. Bu problemi aşmak için aşağıdaki yuvarlama sistemini kullanmayı tercih ettik.

Kod: Tümünü seç

//   Memo1.Lines.Add(FloatToStr(RoundTo(StrToFloat(Edit1.Text),-2)));
  Memo1.Lines.Add(FloatToStrF((Floor(StrToFloat(Edit1.Text)*100+0.5)/100),ffNumber,12,2));
Bu kodu yanlış hatırlamıyorsam yine forumdan bulmuştum.

Kolay gelsin..
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

Re: roundto fonksiyonu

Mesaj gönderen TRSoft »

Fahrettin Hocam yazdı:Aslında round fonksiyonu doğru çalışıyor. Fakat aldığımız matematik eğitimi dolayısıyla Round fonksiyonunun çalışma mantığını yanlış tahmin ediyoruz...

Şöyle ki Round fonksiyonu normalde en yakın tam sayıya yuvarlama yapar fakat eğer yuvarlayacağınız rakam tam olarak ortada ise yani 2.5 3.5 gibi rakamlar ise o zaman en yakın çift rakama yuvarlama yapmaktadir.

Yani
round(2.5)=2
round(3.5)=4
sonuçları gayet normaldir. Sorun hepimizin başına gelen bu fonksiyonun çalışma şeklini yanlış tahmin etmemizdir. Helpten baktığınızda şu cümleyi görmektesiniz zaten.
X is a real-type expression. Round returns an Int64 value that is the value of X rounded to the nearest whole number. If X is exactly halfway between two whole numbers, the result is always the even number.

Peki çözüm ne derseniz de ya Round fonksiyonunun bu maktığını bilerek kullanın ya da 2.5 yuvarlanınca 3 olsun diyorsaniz. RoundX isimli su fonksiyonu tanimlyip kullanın.

Kod: Tümünü seç

    function RoundX( x : Extended ) : Extended;
    var
       Rint, Rdec : Extended;
    begin
         Rint := int(x);
         Rdec := x - Rint ;
         If Rdec >= 0.5 then
            Result := Rint + 1
         else
            Result := Rint;
    end;
Kolay gelsin...
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: roundto fonksiyonu

Mesaj gönderen csunguray »

RoundTo fonksiyonu banker yuvarlaması yapar. Aritmetik yuvarlama yapmak için SimpleRoundTo fonksiyonu kullanın.
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/)
Cevapla