Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Problem z wartością zmiennej double

Ostatnio zmodyfikowano 2021-04-24 08:44
Autor Wiadomość
Czaroun
Temat założony przez niniejszego użytkownika
C++ Problem z wartością zmiennej double
» 2021-04-24 00:26:50
Witam, mam do stworzenia program który będzie symulował kasę. Użytkownika podaje kwotę a następnie musi ją zapłacić przy pomocy monet. Jeśli zapłaci za dużo, trzeba wydać resztę. Program działa bez problemowo do momentu kiedy do gry nie wejdą liczby zmiennoprzecinkowe, a konkretniej kiedy program przyjmuje, bądź ma wydać 10gr bądź 20gr - czyli liczby 0.1 i 0.2. W przypadku 0.5 nie pojawia się taki problem. Poczytałem trochę w Internecie na ten temat i nie wiem że problem polega w tym że liczby zmiennoprzecinkowe komputer widzi inaczej niż my. Udało mi się przy pomocy programu ustalić że komputer widzi liczbę 0.2 jako 0.2000000000000000111, natomiast 0.1 jako 0.1000000000000000056. Nie umiem jednak dalej tak zmodyfikować mój program aby działał on poprawnie. Proszę o wskazówki.

C/C++
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
   
setlocale( LC_ALL, "" );
   
double moneta, cena;
   
cout << "Podaj kwotę ";
   
cin >> cena;
   
cout << "-------------------------------UWAGA-------------------------------" << endl
    << "AUTOMAT PRZYJMUJE TYLKO NOMINAŁY 5zł, 2zł, 1zł, 50gr, 20gr, 10gr!!!" << endl
    << "        PROSZE WPISYWAĆ WARTOŚCI NOMIAŁÓW ZGODNIE ZE SCHEMATEM" << endl
    << "            5zł=5  2zł=2  1zł=1  50gr=0.5  20gr=0.2  10gr=0.1" << endl
    << "-------------------------------------------------------------------" << endl << endl;
   
do {
       
cout << "Pozostało do zapłaty: " << cena << " zł" << endl;
       
cout << "Wrzuć monetę: ";
       
cin >> moneta;
       
if( moneta == 5 || moneta == 2 || moneta == 1 || moneta == 0.5 || moneta == 0.2 || moneta == 0.1 ) {
           
cout << "Wrzucono monete " << moneta << " zł";
           
cena = cena - moneta;
       
}
       
else {
           
cout << "Nie ma takiej monety";
       
}
       
cout << endl << endl;
   
}
   
while( !( cena < 0.09 ) );
   
   
cout << "Zapłacono" << endl;
   
if( cena == 0 ) {
       
       
cout << "Dziękujemy za skorzystanie z automatu" << endl
        << "KONIEC" << endl;
       
return 0;
   
}
   
else {
       
cout << cena << endl;
       
cena = - cena;
       
cout << "Reszta do wydania: " << cena << endl;
       
cout << "Automat za chwilę wyda resztę" << endl;
       
system( "pause" );
       
system( "cls" );
       
cout << "---------------WYDAWANIE RESZTY---------------" << endl
        << "Oto twoja reszta: " << cena << endl
        << "Wydaję monety: ";
       
do {
           
if( cena >= 0.1 && cena < 0.2 ) {
               
cout << "10gr ";
               
cena = cena - 0.1;
           
}
           
else if( cena >= 0.2 && cena < 0.5 ) {
               
cout << "20gr ";
               
cena = cena - 0.2;
           
}
           
else if( cena >= 0.5 && cena < 1 ) {
               
cout << "50gr ";
               
cena = cena - 0.5;
           
}
           
else if( cena >= 1 && cena < 2 ) {
               
cout << "1zł ";
               
cena = cena - 1;
           
}
           
           
else if( cena >= 2 ) {
               
cout << "2zł ";
               
cena = cena - 2;
           
}
        }
       
while( !( cena == 0 ) );
       
       
cout << endl;
       
cout << "KONIEC" << endl
        << "----------------------------------------------";
       
return 0;
   
}
}
P-178489
DejaVu
» 2021-04-24 08:44:55
Opcje:
1. Użyć typu int zamiast typu double do przechowywania kwot i kwoty trzymać w groszach (kwota % 100 to grosze, natomiast kwota / 100 to złotówki).
2. Zostać przy typie double i zaokrąglać wyświetlane wartości do dwóch cyfr po przecinku (ma to swoje wady, ale póki jest to program do użytku 'domowego' lub 'nauki' programowania to jest to poprawne rozwiązanie).
P-178490
« 1 »
  Strona 1 z 1