Was verstehst Du an "rechnen mit Cent" nicht?
`einkauf` rechnest Du ganz am Anfang von Cent in Euro um! Laß das.
Die while-Schleife sollte eigentlich eine for-Schleife sein,
dann ist es auch egal, wie die NOTES sortiert sind.
Bei gegeben sind zu viele Klammern.
Da art ja immer "Schein" ist, fliegt einiges an Code raus.
Modularisiere Deinen Code auch mehr, also berechne das Kleingeld und bestimme in einem unabhängigen Schritt, wie der Text aussieht.
Wenn Du schon eine Template-Engine hast, warum nutzt Du sie dann nicht?
Code: Alles auswählen
import random
from django.template import Template, Context, Engine, Library
register = Library()
@register.filter
def format_zahl(wert, stellen=2, trailing_zeros=True):
text = f"{wert:.{stellen}f}".replace(".", ",")
return text.rstrip(",0") if not trailing_zeros and "," in text else text
engine = Engine()
engine.template_builtins.append(register)
TEMPLATE_EINKAUF = engine.from_string(
"Du hast für {{einkauf|format_zahl:2}}€ eingekauft und bezahlst mit einem {{gegeben|format_zahl:0}}€ Schein"
"{% if kleingeld > 0 %} und {{kleingeld|format_zahl:0}}ct in Münzen{% endif %}.<br>"
"Wieviel Wechselgeld erhälst du?"
)
NOTES = [5, 10, 20, 50, 100]
def aufgabe():
einkauf =random.randint(5, 5950)
gegeben = random.choice([note for note in NOTES if note * 100 > einkauf])
kleingeld = einkauf % 50 if random.random() > 0.1 else 0
ergebnis = gegeben * 100 + kleingeld - einkauf
context = Context(dict(
einkauf=einkauf / 100,
gegeben=gegeben,
kleingeld=kleingeld
))
print(TEMPLATE_EINKAUF.render(context))
print(ergebnis)