Seite 1 von 1

Lange Kommazahlen ohne Grund?

Verfasst: Sonntag 28. Februar 2021, 14:18
von Zinv
Hi,
ich kenne mich nicht sehr gut aus, also entschuldige ich mich schonmal, falls ich irgendwas offensichtliches übersehen habe.

Ich hab nen kleinen Nebenjob (sonntags Zeitungen austragen) und habe aus Spaß die Abrechnung am Ende des Monats in einen Python Code schreiben wollen, damit ich das nicht immer alles aufschreiben muss, sondern nur zwei Faktoren eingeben muss. Aus irgendwelchen Gründen kommen teilweise bei dem Ergebnis total lange Kommazahlen heraus, wie z.B. 12,399999999999999, obwohl das Ergebnis einfach nur 12,4 sein müsste. An sich kann ich das ja selbst dann runden, ich wollte aber trotzdem mal fragen, ob man das irgendwie fixen kann? Ich habe wirklich keine Ahnung, warum das passiert, weil, wenn man die Rechnung selbst schriftlich durchführt, keine Zahl irgendwo mehr als eine Nachkommastelle hat.
Falls ihr den Code sehen wollt:

Code: Alles auswählen

Sonntage = float(input("Gib hier die Anzahl der Sonntage dieses Monats ein:"))
EinnahmenSoll = 2*float(2.45)*Sonntage
Verdienst = 4*Sonntage
Überweisen = float(EinnahmenSoll) - float(Verdienst)
GeldEingenommen = input("Gib hier ein, wieviel Geld du bekommen hast! Kommas müssen als Punkt eingegeben werden:")
Trinkgeld = float(GeldEingenommen)-float(EinnahmenSoll)
GeldBehalten = int(Verdienst)+float(Trinkgeld)
Danke schonmal :D

Re: Lange Kommazahlen ohne Grund?

Verfasst: Sonntag 28. Februar 2021, 14:23
von __deets__
Das ist die Ungenauigkeit die du bekommst durch die Darstellung als binaerzahl. Jede Programmiersprache "leidet" darunter. Im Dezimalsystem hast du das gleiche: probier mal die Zahl 10 / 3 korrekt darzustellen. Da musst du auch irgendwann aufhoeren etwas hinzuschreiben. Oder dich auf einen langen Winter gefasst machen.

Man kann damit auf verschiedene Arten und Weisen umgehen, aber das einfachste, gerade fuer ein Tool das eh nur einen kleinen Ueberblick verschaffen soll, ist die Rundung BEI AUSGABE die richtige Wahl.

Also zB

Code: Alles auswählen

GeldBehalten = 12.4
print(f"{GeldBehalten:10.2f}")

Re: Lange Kommazahlen ohne Grund?

Verfasst: Sonntag 28. Februar 2021, 14:36
von Zinv
__deets__ hat geschrieben: Sonntag 28. Februar 2021, 14:23 Das ist die Ungenauigkeit die du bekommst durch die Darstellung als binaerzahl. Jede Programmiersprache "leidet" darunter. Im Dezimalsystem hast du das gleiche: probier mal die Zahl 10 / 3 korrekt darzustellen. Da musst du auch irgendwann aufhoeren etwas hinzuschreiben. Oder dich auf einen langen Winter gefasst machen.

Man kann damit auf verschiedene Arten und Weisen umgehen, aber das einfachste, gerade fuer ein Tool das eh nur einen kleinen Ueberblick verschaffen soll, ist die Rundung BEI AUSGABE die richtige Wahl.

Also zB

Code: Alles auswählen

GeldBehalten = 12.4
print(f"{GeldBehalten:10.2f}")
Dankeschön, das funktioniert! Und reicht auch vollkommen aus, die Ergebnisse sind richtig :D

Re: Lange Kommazahlen ohne Grund?

Verfasst: Sonntag 28. Februar 2021, 14:40
von __deets__
Schoen das es klappt. Kleine Etiquette-Anmerkung: bitte nicht den Post direkt davor zitieren. Der steht da ja schon, und jetzt faktisch zweimal.

Re: Lange Kommazahlen ohne Grund?

Verfasst: Sonntag 28. Februar 2021, 22:38
von __blackjack__
@Zinv: Weitere Anmerkungen: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Du wendest die Umwandlungsfunktionen zu häufig und an den falschen Stellen an. Wenn der Benutzer eine Zahl eingeben soll, dann wandelt man die eingegebene Zeichenkette sofort um und nicht erst in der Rechnung.

2.45 ist bereits eine Gleitkommazahl, da macht ein `float()`-Aufruf keinen Sinn. Aber auch bei den meisten Namen macht es keinen Sinn. Es reicht die Eingaben umzuwandeln. Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    anzahl_sonntage = int(
        input("Gib hier die Anzahl der Sonntage dieses Monats ein: ")
    )
    einnahmen_soll = 2 * 2.45 * anzahl_sonntage
    verdienst = 4 * anzahl_sonntage
    ueberweisungsbetrag = einnahmen_soll - verdienst
    einnahmen = float(
        input(
            "Gib hier ein, wieviel Geld du bekommen hast!"
            " Kommas müssen als Punkt eingegeben werden: "
        )
    )
    trinkgeld = einnahmen - einnahmen_soll
    behaltener_betrag = verdienst + trinkgeld
    ...


if __name__ == "__main__":
    main()