Błędne mnożenie liczby we float/double


(Draygon123) #1

No więc chcę napisać program na wydawanie reszty w walucie PL . Pierwszy krokiem w moim programie jest podanie kwoty i zamienie ją na zł i na gr . I już jest problem...

cout << "Podaj kwote\n";

    cin >> kwota;

    zlote = kwota;

    grosze = (kwota - (int)kwota) * 100.0;

    cout << "Zlotych: " << zlote <<"\n" ; 

    cout << "Groszy: " << grosze <<"\n" ;

Zł i gr są w int więc program sam konwertuje gdzie trzeba .Chodzi o to ze w niektórych przypadkach np . 2.06 wychodzi mi 2 zł i 5 grosze ... Powód tego jest taki ze 0.06 * 100 = 5.99999 ... Niby czemu ? Jak temu zaradzić ?


(Rolek0) #2

Liczby zmiennoprzecinkowe mają ograniczoną dokładność, poza tym są kodowane dwójkowo, nie da się precyzyjnie wyrazić w nich każdej wartości dziesiętnej. http://gynvael.coldwind.pl/?id=374

Kwoty przechowuj jako całkowitą liczbę groszy (albo ich części jeśli potrzebujesz ułamków groszy), np. 1000 to 10 zł.


(Draygon123) #3

Mógłby ktoś napisać kod który z kwoty zapisanej wdg : LiczbaZłotych.LiczbaGroszy na złote i grosze ? Czy musze to na 2 wprowadzeniu rozbić ? : /


(Adammo) #4

Co prawda bardziej znam Jave/Pascal niż C++, jednak sprawdzałem i u mnie działa coś takiego:

double kwota;

cout << "Podaj kwote\n";

cin >> kwota;

zlote = (int)kwota;

grosze = (int)((kwota - (int)kwota) * 100);

cout << "Zlotych: " << zlote <<"\n" ; 

cout << "Groszy: " << grosze <<"\n" ;

(Draygon123) #5

Twój kod jest prawie tym samym z tym że rzutowanie jest wpisane tam gdzie kompilator sam by sobie przerzucił . No i double coś zmienia ale poprostu błąd jest w innych przypadkach .

cout << "Podaj kwote\n";

    cin >> kwota;

    zlote = kwota;

    temp = (kwota - (float)zlote) * 100; 

    grosze = przybliz(temp);

    cout << "Zlotych: " << zlote <<"\n" ; 

    cout << "Groszy: " << grosze <<"\n" ;

Użyłem funkcji do przybliżenia(na zasadzie błędu przybliżenia) I działa prawidłowo ale jestem załamany że taka prosta operacja wymaga takie komplikacji kodu i czytelności : /


([alex]) #6
cout << "Podaj kwote\n";

    cin >> kwota;

    grosze=kwota*100+0.5;

    zlote=grosze/100;

    grosze-=100*zlote;

    cout << "Zlotych: " << zlote <<"\n" ;

    cout << "Groszy: " << grosze <<"\n" ;

Jednak lepiej nie używaj liczb zmiennoprzecinkowych do obliczeń walutowych.