float sayiyi yuvarlama in C

Başlatan Yuunus, 08 Mart 2021, 09:23:53

Yuunus

merhaba, 3.12656 gibi bir sayinin ondalik kisminin sadece iki hanesinin yuvarlanmasini istiyorum 3.13 gibi,aradigim round ceil floor gibi bir fonksiyon yukardaki adi gecen fonksiyonlarin hepsi tamsayi kismina yuvarliyor.
derleyici gcc

dumansiz

float sayi_float;
int sayi_int;
sayi_float*=100;
sayi_int=(int)(sayi_float+0.5);
sayi_float=sayi_int/100;
Kodu denemedim ama bu mantıkla olur diye tahmin ediyorum.

volkanunal

#include<stdio.h>
#include<math.h>

int main () {
    
    double f = 3.12656;

    double int_part;
    
    double fractional = modf(f, &int_part);
    
    fractional = fractional * 100;
    
    fractional = round(fractional);
    
    fractional = fractional / 100;
    
    f = fractional + int_part;
    
    printf("\r\n Last State of f : %lf", f);    
    
    return(0);
}

Böyle bir şey aklıma geldi hocam, ondalık kısmı alıp ayrı şekilde yuvarlamak sonrasında birleştirmek.
Primum nil nocere

volkanunal

Alıntı yapılan: dumansiz - 08 Mart 2021, 11:05:05
float sayi_float;
int sayi_int;
sayi_float*=100;
sayi_int=(int)(sayi_float+0.5);
sayi_float=sayi_int/100;
Kodu denemedim ama bu mantıkla olur diye tahmin ediyorum.

Ben bir değer verip denedim hocam, olmadı.
Primum nil nocere

Yuunus

#4
aslinda forumun birinde soyle bir kod var ve calisiyorda lakin yogun bir sekilde float islem yapacagim icin sistemi cok yorar, oda isime gelmiyor
float round(float var) 
{ 
    // we use array of chars to store number 
    // as a string. 
    char str[40];  
  
    // Print in string the value of var  
    // with two decimal point 
    sprintf(str, "%.2f", var); 
  
    // scan string value in var  
    sscanf(str, "%f", &var);  
  
    return var;  
}

dumansiz

#5
Alıntı yapılan: volkanunal - 08 Mart 2021, 11:15:11Ben bir değer verip denedim hocam, olmadı.
Düzelttim  :) . Son satırda tekrar float tipine dönüştürmeyi unutmuşum.
float sayi_float;
int sayi_int;
sayi_float=3.126;
sayi_float*=100;
sayi_int=(int)(sayi_float+0.5);
sayi_float=((float)sayi_int)/100;
Bu sefer denedim, çalışıyor.

quarko

Sayıyı 1000 le çarpıp integer değişkene at. Sonra 5 ekle. 3131 olarak elde edeceksin. Bu aşamadan sonra ister bu haliyle istersen 1000'e bölüp float olarak kullanabilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

dumansiz

Alıntı yapılan: quarko - 08 Mart 2021, 11:31:15Sayıyı 1000 le çarpıp integer değişkene at. Sonra 5 ekle. 3131 olarak elde edeceksin. Bu aşamadan sonra ister bu haliyle istersen 1000'e bölüp float olarak kullanabilirsin.
1000 e böldüğünde 3.131 olacak.

quarko

Alıntı yapılan: dumansiz - 08 Mart 2021, 11:35:211000 e böldüğünde 3.131 olacak.

Bende farkındayım merak etmeyin. Bu kısımdan sonra bir yerlere yazdırılacaksa ondalık kısmın ilk iki hanesi alınabilir. Yoksa tam sayı halindeyken birlik hanesindeki fazlalık çıkarılabilir.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

brandice5

Ekranda yazdırmak içinse printf zaten yuvarlıyor.

printf("%.2f", 3.12656) --> 3.13

Yuunus

yok @brandice5 float olarak lazim bana, cok dalavere cevirmeden yapmak istedim, gonderdigim kod bu isi cok iyi yapiyor lakin cok clock harcar, bana hizli birseyler lazim. arkadaslar sagolsun yazdilar ama su an deneme firsatim yok.

mehmet

Her şeyi 100 ile çarpıp int olarak
işlem yapın. Ekran işlemi varsa
virgüllü yazdırırsınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Yuunus

Alıntı yapılan: mehmet - 08 Mart 2021, 14:00:51Her şeyi 100 ile çarpıp int olarak
işlem yapın. Ekran işlemi varsa
virgüllü yazdırırsınız.
carptiktan sonraki kismi ne yapalim truncate ile mi kirpicaz, pardon siz yukardaki float sayiya gore yorumladiniz, virgulden sonra 6 hane var, o kismi unuttum

mehmet

"int" içerisinde işlem yaparsınız. Siz
virgülden sonra iki hande lazım dediniz.
Alta ya da üste yuvarlamak sizin elinizde.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr