Mały defekt w prostym kodzie.

0

Witam!
Man problem z kodem.
Działa on jak zwykły automat.
Na początku podajemy kwotę a następnie kwotę wrzuconą do automatu. On wylicza resztę i przelicza ile jakich nominałów powinien wydać.
Jednak mam pewien problem z tym, ponieważ gdy podam obojętnie jakie 2 liczby parzyste lub 2 nieparzyste to reszte wylicza dobrze a natomiast gdy dam jedną parzystą a drugą nieparzystą lub na odwrót to ucina 1gr lub jeden inny nominał np. gdy damy 4.33 i 5 to wydaje 66gr a powinien 67. Co jest nie tak?

3

nie wgłębiałem się w szczegóły, ale prawie a pewno chodzi o błędy zaokrągleń (błąd zaokrągleń powoduje, że w obliczaniach pojawia ci się coś takiego: 0.0399999999 i dzielisz przez 0.01 i wychodzi ci 3 zamiast 4). Pamiętaj, że liczby 0.2 i 0.1 nie mają dokładnej reprezentacji binarnej.
Weź przelicz to na liczby całkowite (przeliczaj wszystko w groszach), a problem zniknie.

0

Nie da rady tego zrobić na złotówkach?

0
Lukasz421 napisał(a):

Nie da rady tego zrobić na złotówkach?

Oczywiście że da rady, tylko że program wyrośnie co najmniej czterokrotnie zaś obliczeń w nim używanych nie zrozumiesz w ciągu najbliższej dekady.

1

@_13th_Dragon: grubo przesadzasz.

const double Epsilon = 0.0000001;
for (int i=0;i<14;i++) {
     l_nom[i]=reszta/nom[i] + Epsilon;
     reszta-=l_nom[i]*nom[i];
}
assert(fabs(reszta)<0.005);

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