x-kom hosting

Jaki błąd w kodzie? //wydawanie reszty

arab
utworzono
utworzono

siemka mam zrobić program ktory podaje ile razy mam wydac dany nominal. problem jest gdy podam np. 2.55, wtedy pokazuje 2x1 0,5x1, 0,02x2, i 0 zl x1 a powinno byc 0,01 zl x 1 ???

 

#include <iostream>
using namespace std;
 
 
 
int main()
{
//tablica dostepnych nominalow
double N[14]={20000, 10000, 5000, 2000, 1000, 500, 200, 100,50,20,10,5,2,1};
int P, i;
double R;
 
cout << "Podaj reszte do wyplacenia: ";
cin >> R;
R=R*100;
 
i=0;
while (R>0)       //dopoki nie wydano calej reszty
{
if (R >= N[i])  //sprawdz czy mozna wydac danym nominalem
{
P=R / N[i];   //ile razy wydac dany nominal
R=R-(N[i]*P); //zmniejsz reszte o wydany nominal
N[i]=N[i]/100;
cout << N[i] << " zl x " << P << endl; //wypisz wynik
}
i++;            //rozpatrz kolejny nominal
}
 
 
return 0;
}
 
 
  • 2 tygodnie później...

Gość
komentarz
komentarz

 [spoiler]nie zabieraj sie za programowanie[/spoiler]

rafalluz
komentarz
komentarz (edytowane)

Problem w tym, że operujesz na double, zmienne tego typu mają specyficzne błędy reprezentacji, np. wpisując 2.55, tak naprawdę w pamięci masz 2.5499999999999997. Żeby to obejść, trzeba korzystać z innego typu zmiennych, np. intów/longów i operować na groszach. Ewentualnie do porównania

R >= N[i]

uwzględnić tolerancję. Np.

if(abs(R - N[i]) > 0.001)

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.