Seite 1 von 1
Problem mit Kommazahlen
Verfasst: Montag 26. Oktober 2020, 21:48
von Tyroun
Guten Abend,
ich habe ein Problem mit meinem Code, welcher hier drunter steht:
Code: Alles auswählen
def countCoins(pay, cost):
coins = [2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01]
changemoney = pay - cost
count = 0
while changemoney > 0.1:
for x in coins:
r = divmod(changemoney, x)
count = count + r[0]
changemoney = r[1]
return count
print(countCoins(2.0, 1.30))
Die Funktion soll, am Ende zurückgeben wie viele Münzen man benötigt um das Wechselgeld rauszugeben. Nun meine Frage und zwar, ist in de Variable changemoney das Wechselgeld gespeichert, was in den meisten Fällen eine Kommazahl ist. in dem Beispiel oben ist dann das Problem, dass wenn divmod durchgelaufen ist mit 0.5 zum Beispiel ist der neue Wert von changemoney dann 0.199999999 .... obwohl es ja eigentlich 0.2 sind. Dadurch das der wert so komisch ist kommt da auch nie das richtige Ergebnis raus. Kann mir jemand helfen, wie ich das richtig hinbekomme?
MfG
Tyroun
Re: Problem mit Kommazahlen
Verfasst: Montag 26. Oktober 2020, 22:17
von snafu
Schau dir das
decimal-Modul an. Das ist genau für solche Probleme gedacht. Ganz wichtig dabei ist, dass du die Kommazahlen als Strings übergeben musst. Andernfalls ist die Zahl schon "falsch", noch bevor sie beim Decimal-Objekt ankommt und damit wäre nichts gewonnen.
Alternativ dazu könntest du die Ergebnisse auch runden lassen mit round(). Dann aber sinnvollerweise wirklich jedes Zwischenergebnis, damit es zu keinen größeren Ungenauigkeiten kommt.
Re: Problem mit Kommazahlen
Verfasst: Montag 26. Oktober 2020, 22:39
von narpfel
Oder einfach in Cents rechnen. 1,495 € wird man ja eher nicht mit Münzen bezahlen müssen.

Re: Problem mit Kommazahlen
Verfasst: Montag 26. Oktober 2020, 22:42
von snafu
narpfel hat geschrieben: Montag 26. Oktober 2020, 22:39
Oder einfach in Cents rechnen.
Ganz genau. Klassischer Erstsemester-Stoff im Informatik-Studium und anderswo.

Re: Problem mit Kommazahlen
Verfasst: Montag 26. Oktober 2020, 23:03
von Sirius3
Die while-Schleife ist falsch und überflüssig. Funktionsnamen schreibt man wie Variablennamen komplett klein count_coins. `x` ist ein schlechter Name für einen coin.
Code: Alles auswählen
COINS = [200, 100, 50, 20, 10, 5, 2, 1]
def count_coins(pay, cost):
changemoney = round(100 * (pay - cost))
count = 0
for coin in COINS:
amount, changemoney = divmod(changemoney, coin)
count += amount
return count
Re: Problem mit Kommazahlen
Verfasst: Dienstag 27. Oktober 2020, 12:52
von Tyroun
Sirius3 hat geschrieben: Montag 26. Oktober 2020, 23:03
Die while-Schleife ist falsch und überflüssig. Funktionsnamen schreibt man wie Variablennamen komplett klein count_coins. `x` ist ein schlechter Name für einen coin.
Code: Alles auswählen
COINS = [200, 100, 50, 20, 10, 5, 2, 1]
def count_coins(pay, cost):
changemoney = round(100 * (pay - cost))
count = 0
for coin in COINS:
amount, changemoney = divmod(changemoney, coin)
count += amount
return count
Vielen Dank
So wie du es geschrieben hast ist natürlich smarter und ich habe es kapiert
MFG
Re: Problem mit Kommazahlen
Verfasst: Dienstag 27. Oktober 2020, 12:53
von Tyroun
snafu hat geschrieben: Montag 26. Oktober 2020, 22:17
Schau dir das
decimal-Modul an. Das ist genau für solche Probleme gedacht. Ganz wichtig dabei ist, dass du die Kommazahlen als Strings übergeben musst. Andernfalls ist die Zahl schon "falsch", noch bevor sie beim Decimal-Objekt ankommt und damit wäre nichts gewonnen.
Alternativ dazu könntest du die Ergebnisse auch runden lassen mit round(). Dann aber sinnvollerweise wirklich jedes Zwischenergebnis, damit es zu keinen größeren Ungenauigkeiten kommt.
Hallo, danke ich werde mir das Modul man anschauen und durchlesen
MfG