zaokrąglenie do danej nie znanej cyfry po przecinku

0

Witam, Piszę w Visual c++ 2010 we frameworku WinForm. Mam za zadanie zaokrąglić liczbę do danego miejsca po przecinku. Z tym, że te miejsce może być różne. Muszę napisać algorytm, który liczy zera po przecinku, np, jeśli liczba to: 0,004823423, to ma być 0,005 ( 5 bo zaokrąglona). Albo jeśli będzie liczba 0,0000000413123, to przejściu przez algorytm zaokrąglania wyjdzie 0,00000004. Nie znana jest ilość zer, gdyż nie wiadomo jakie dane wprowadzi wcześniej użytkownik.
Z góry dziękuję za pomoc :)

0

EDIT: niepoprawnie zrozumiałem zadanie. metoda prymitywna:

double p10=pow(10.0,Ile_znakow);
liczba=floor(liczba*p10+0.5)/p10;

Jeżeli tylko dla wyświetlenia to:

cout.setf(ios::fixed);
cout<<setprecision(Ile_znakow)<<liczba;

</del>Poprawne rozwiązanie niżej.

0

Wykombinowałem takie coś:

#include <iostream>
#include <cmath>

float round_to(float f, int digit)
{
 unsigned long int fact = pow(10, digit);
 return float(int(f*fact+0.5))/fact; // `+0.5`, ponieważ musimy mieć zaokrąglenie w górę; dodatkowo rzutujemy na float, by wykonać zmiennoprzecinkowe dzielenie
}

float my_round(float f)
{
 float test;
 int digit = 1;

 do
 {
  test = round_to(f, digit);
  digit++;
 } while (test == 0);

 return round_to(f, digit-1);
}

int main()
{
 float f;
 std::cin >> f;
 std::cout << my_round(f);
}

Opiera się na tym, że po kolei zaokrągla do coraz następnych cyfr, dopóki wynik tego zaokrąglania nie będzie różny od zera.

0

@Patryk27, trochę przekombinowałeś:

int n;
for(n=0;liczba<1;++n) liczba*=10;
liczba=floor(liczba+0.5)/pow(10.0,n);
0

Potrzeba mi tylko ostatnia cyfrę (1 cyfrę) różną od zera zaokrąglić :) tylko, że ja piszę we framework WinForm, a nie Win32 GUI :) ale postaram się, to przekształcić :) dzięki za pomoc :)

0

trochę nie rozumiem tego w środku liczba<1 choć w for jest zmienna n. A nie da się tego zrobić na zasadzie, że liczy ilość zer po przecinku aż napotka cyfrę inną niż zero. np. w 0,002 masz 2 zera. Później w zmiennej np "zera" dodaje 1, aby to było 3 miejsca po przecinku i już dalej wykorzystując funkcję round zaokrąglam do tych 3 miejsc po przecinku. Próbowałem jakoś liczyć te zera, ale coś nie wychodziło :)

0

W sumie, to działa Twój algorytm :) może mój sposób był trochę przekombinowany, ale też jak by dało radę zrobić, myślę, że by działało :) Dzięki za pomoc, teraz już sobie poradzę dalej :)

0
myszka__89 napisał(a):

W sumie, to działa Twój algorytm :) może mój sposób był trochę przekombinowany, ale też jak by dało radę zrobić, myślę, że by działało :)

Pytanie czy musisz sam rzeczywiście zaimplementować algorytm rozwiązujący ten problem, czy potrzebujesz tylko takiego mechanizmu. Bo jeśli sama idea projektowania algorytmu nie jest dla ciebie istotna to kolejną alternatywą może być rozwiązanie tego przy pomocy sstream'a.

    double x = 0.0000000413123; //0.004823423
    unsigned n = 0;
    stringstream ss;

    ss << scientific << x - static_cast<int>(x);
    ss.str(ss.str().substr(ss.str().find('e') + 2));
    ss >> n;

    cout.precision(n);
    cout << fixed << x;

1 użytkowników online, w tym zalogowanych: 0, gości: 1