[C++] Zaokrąglanie liczb


(Mnemonic) #1

Cześć, napisałem sobie taki kod:

#include

#include

#include

#include

#include

using namespace std;


int main()

{

  ifstream plik("liczby.txt");

  int liczba;

  vectorslowa;

  while(!plik.eof()){

    plik >> liczba;

    slowa.push_back(liczba); 

  } 

  double suma=0;

  vector::iterator it=slowa.begin();

  for( ;it!=slowa.end(); it++)

      suma+= *it;

  cout << "Suma: " << suma << '\n';  


  it=min_element(slowa.begin(),slowa.end());

  cout << "Minimum: " << *it << '\n';


  it=max_element(slowa.begin(),slowa.end());

  cout << "Maximum: " << *it << '\n';


  int a=cout.precision();

  cout << setprecision(4) << "Srednia: " << suma/slowa.size() << '\n'; 

  cout << setprecision(a);


  cin.get();

}

I mam pytanie odnośnie setprecision. Chciałbym, aby zaokrąglał mi on liczbę ułamkową do dwóch miejsc po kropce, a nie tak jak teraz liczy znaki od początku i zaokrągla. Da się to zrobić przy użyciu jakiegoś innego manipulatora ?


(Sawyer47) #2

Na szybko 3 opcje:

  1. Użyć printf

  2. Napisać funkcję, która naprawdę zaokrągla liczbę

  3. W zależności od liczby generować argument dla std::setprecision (raczej niewygodne)


(Mnemonic) #3

Rozumiem. Napisałem sobie więc taką funkcję:

double zaokroglij(double x)

{

    ostringstream os;

    os << x;

    string a=os.str();

    size_t b=a.find('.');

    string c(a,0,b+3);

    istringstream is(c);

    is >> x;

    return x;   

}

Tylko teraz nie mam pomysłu gdzie dopisać odpowiedni warunek, aby zaokrąglało mi liczbę a nie tylko ją ucinało. Dokładniej mówiąc mam na myśli sytuację gdy kolejna liczba (pierwsza 'ucięta') jest większa od 5, a więc poprzednią trzeba zwiększyć o tą jedynkę. Jeśli ktoś ma inny pomysł na napisanie tej funkcji to chętnie się dowiem.


(Sawyer47) #4

Mógłbyś też napisać własny manipulator, który wypisywałby liczbę z zadaną liczbą cyfr, coś w stylu:

std::cout << myround(num, 2);

A wiele różnych implementacji zaokrąglania można znaleźć w internecie. Można też użyć sprintf (i nadal używać do wyświetlania tylko strumieni).


(Kanaliaon) #5
int round(double liczba)

(Mnemonic) #6

Znalazłem właśnie rozwiązanie. Dla mojego kodu wygląda tak:

cout << floor((suma/slowa.size())*100+0.5)/100 << '\n';

A nad manipulatorem pomyślę.

Dzięki za pomoc.


(Sawyer47) #7

Ale Mnemonicowi chodzi o zaokrąglenie do 2 cyfr po separatorze dziesiętnym, nie do jedności.


([alex]) #8
#include