Ich lerne gerade Python (2.7), und eine Übung sagt, ich soll ein Programm schreiben, das zählt, wie viele Münzen man braucht, um eine bestimmte Summe zu bezahlen. Meine Lösung ist dies:
%Vor%Das funktioniert fast, aber wenn ich z.B. 17,79 gibt mir die Münzen für 17,78.
%Vor%Warum? Hat das etwas mit Runde zu tun?
Bei Währungsberechnungen ist es am besten, float
type zu vermeiden, wenn dies aufgrund von häufigen Rundungsfehlern möglich ist. Sie können es auf ähnliche Weise tun:
Ich habe auch den Variablennamen von sum
in amount
geändert - sum
wird die sum
integrierte Funktion.
Ergebnis:
%Vor% Alternativ können Sie dies ohne die interne while
-Schleife wie folgt implementieren:
Es ist möglich, die Schleife früher zu beenden ( if not amount: break
) und unnötige Operationen zu vermeiden ( if not n: continue
), aber ich habe diese Wächter aus Gründen der Lesbarkeit weggelassen.
Eine andere mögliche Alternative ist die Verwendung des decimal
-Datentyps.
Dies ist ein Problem im Zusammenhang mit float
Genauigkeit. Nach der Berechnung bekomme ich:
d. etwas weniger als ein Euro Cent (beachten Sie, dass Sie es nicht sum
nennen sollten, weil Sie dann die eingebaute Funktion sum
überschatten und zB sum(coins)
nicht verwenden können, um die Summe zu erhalten ). Sie können dies mit einem Toleranzansatz beheben, indem Sie
mit
%Vor%Ebenso ist es am besten, floats mit einer Toleranz zu vergleichen, anstatt:
%Vor%verwenden
%Vor%Wie gesagt, scheint dies ein Rundungsproblem zu sein, da der Algorithmus (für diesen Münzsatz!) korrekt ist. Wenn Sie die Münzen als ganze Zahlen in Cent speichern, wird die richtige Lösung berechnet:
%Vor%Ausgabe:
%Vor% Übrigens würde ich empfehlen, sum
nicht als Variablennamen zu verwenden, da dies der Name einer eingebauten Funktion ist.
@BartoszKP wies darauf hin, dass es am besten ist, float
zu vermeiden, und weil Sie am Ende einige böse Dezimalzahlen haben, die Ihnen nicht gefallen. Wenn Sie also round
mit minimalen Änderungen an Ihrem Code verwenden möchten, können Sie dies tun:
[out:]
%Vor%Aber das ist NICHT die optimale Lösung, da Sie dies lieber möchten;)
%Vor%Tags und Links python