Lange Kommazahlen ohne Grund?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zinv
User
Beiträge: 4
Registriert: Freitag 11. Dezember 2020, 23:25

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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}")
Zinv
User
Beiträge: 4
Registriert: Freitag 11. Dezember 2020, 23:25

__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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schoen das es klappt. Kleine Etiquette-Anmerkung: bitte nicht den Post direkt davor zitieren. Der steht da ja schon, und jetzt faktisch zweimal.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten