Python zählt durch eine Zahl mit =

8

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?

    
Maxi 01.01.2014, 12:15
quelle

5 Antworten

10

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:

%Vor%

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:

%Vor%

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.

    
BartoszKP 01.01.2014, 12:27
quelle
2

Es hat. Wenn Sie nach der Ausführung des Codes den Wert 'sum' überprüfen, erhalten Sie etwas wie 0,009999999999999133, das kleiner als die kleinste Münze ist.

Mein Vorschlag? Mach alles in Cent!

%Vor%     
RGS 01.01.2014 12:31
quelle
2

Dies ist ein Problem im Zusammenhang mit float Genauigkeit. Nach der Berechnung bekomme ich:

%Vor%

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

ersetzen %Vor%

mit

%Vor%

Ebenso ist es am besten, floats mit einer Toleranz zu vergleichen, anstatt:

%Vor%

verwenden

%Vor%     
jonrsharpe 01.01.2014 12:34
quelle
1

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.

    
dsd 01.01.2014 12:31
quelle
0

@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:

%Vor%

[out:]

%Vor%

Aber das ist NICHT die optimale Lösung, da Sie dies lieber möchten;)

%Vor%     
alvas 01.01.2014 12:30
quelle

Tags und Links