Yuvarlama 2

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
eduran
Üye
Mesajlar: 52
Kayıt: 03 Tem 2003 04:02

Yuvarlama 2

Mesaj gönderen eduran »

selam arkadaşlar.

Round fonksiyonunun görevini en yakın tam sayıya yuvarlama yapmak diye biliyorum. Fakat şöyle bişey yaptığımda ilginç sonuçlar çıkıyor;

Kod: Tümünü seç

  messagedlg('Round(0.5)-->'+inttostr(round(0.5))+#13+
            'Round(1.5)-->'+inttostr(round(1.5))+#13+
            'Round(2.5)-->'+inttostr(round(2.5))+#13+
            'Round(3.5)-->'+inttostr(round(3.5))+#13+
            'Round(4.5)-->'+inttostr(round(4.5))+#13+
            'Round(5.5)-->'+inttostr(round(5.5))+#13+
            'Round(6.5)-->'+inttostr(round(6.5))+#13,mtInformation,[mbok],0);

Yukarıda ki koda göre;
round(0.5) =0
round(1.5) =2
round(2.5) =2
round(3.5) =4
round(4.5) =4
round(5.5) =6
round(6.5) =6

Acaba ben yanlış bir şey mi yapıyorum ya da fonksiyonun çalışmasını tam olarak bilmiyor muyum? Delphi 5 kullanıyorum.. İyi çalışmalar..
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

FloatToStrF fonksiyonunu kullanabilirsin.

Kullanımı :
function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer): string;

Kod: Tümünü seç


            messagedlg('Round(0.5)-->'+FloatToStrF(0.5,ffnumber,0,0)+#13+
            'Round(1.5)-->'+FloatToStrF(1.5,ffnumber,0,0)+#13+
            'Round(2.5)-->'+FloatToStrF(2.5,ffnumber,0,0)+#13+
            'Round(3.5)-->'+FloatToStrF(3.5,ffnumber,0,0)+#13+
            'Round(4.5)-->'+FloatToStrF(4.5,ffnumber,0,0)+#13+
            'Round(5.5)-->'+FloatToStrF(5.5,ffnumber,0,0)+#13+
            'Round(6.5)-->'+FloatToStrF(6.5,ffnumber,0,0)+#13,mtInformation,[mbok],0);
Veya bu işi Trunc fonksiyonu ilede yapabilirsin

Örnek

Kod: Tümünü seç


            ShowMessage(FloatToStr(Trunc(4.5+0.5)));

Umarım yardımcı olabilmişimdir.

İyi Çalışmalar.
Kullanıcı avatarı
eduran
Üye
Mesajlar: 52
Kayıt: 03 Tem 2003 04:02

Mesaj gönderen eduran »

selam. yardımınız için teşekkürler. floattostrf fonksiyonu çalışıyor. amacım bulunan değeri (1.575.000 gibi) 50.000`in katları şeklinde en yakın sayıya yuvarlamak. onu da diğer sorduğum soruya (yuvarlama) verilen cevaplarla yapıyorum. Şu şekilde;

Kod: Tümünü seç

YUVARLANMIS_SONUC:=round(YUVARLANACAK_RAKAM/50000)*50000;
sizin tavsiye ettiğiniz fonksiyonu (floattostrf`i) buraya uygulayınca problem çıkartıyor. ticaret lisesinde öğretmenim. öğrencilerin stajlardan aldığı paraların hesaplamalarında çıkan küsüratlarda takıldım. round fonksiyonu doğru çalışmıyor. ilgilenen ve ilgilenecek bütün arkadaşlara teşekkürler. iyi çalışmalar.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Kod: Tümünü seç

    Label1.Caption := FloatToStr(Round(474000/50000)*50000);
    Label2.Caption := FloatToStr(Round(475000/50000)*50000);

    Label3.Caption := FloatToStr(Round(324000/50000)*50000);
    Label4.Caption := FloatToStr(Round(325000/50000)*50000);

Burada sonuclar label1 = 450000, label2 = 500000, label3 = 300000, label4 = 300000 olacaktır sebebi ise 50000'in aşağı rakamları 25000 gibi aşağıya yuvarlar 75000 gibi rakamları ise yukarı yuvarlar.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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...
Kullanıcı avatarı
eduran
Üye
Mesajlar: 52
Kayıt: 03 Tem 2003 04:02

Mesaj gönderen eduran »

ilgilenen arkadaşlara teşekkür ederim..
Kullanıcı avatarı
nugre
Üye
Mesajlar: 54
Kayıt: 17 Kas 2003 10:57
Konum: Bursa

Mesaj gönderen nugre »

aşağıdaki fonksiyon yuvarlama yapıyor


Kod: Tümünü seç

setroundmode(rmUp);
Cevapla