Ich bin gespannt, welches als Währungsfeld besser geeignet wäre. Ich werde einfache Operationen durchführen, z. B. die Differenzierung, den Prozentsatz zwischen alten und neuen Preisen. Ich habe vor, zwei Ziffern nach der Null (dh 10,50) zu behalten. Wenn diese Ziffern meistens Null sind, verstecke ich diese Zahlen und zeige sie als "10" an.
ps: Währung basiert NICHT auf Dollar :)
django
django-models
Hellnar
quelle
quelle
>>> 10.50 - 0.20
in Python 2.7 bekommen10.3
.1.00 + 0.14
oder"%.15f" % (10.5 - 0.2)
- Das Problem kann durch (ich nehme an) bugs.python.org/issue1580 oder ähnliches verdeckt werden .Die Antwort auf die Frage ist richtig, jedoch werden einige Benutzer über diese Frage stolpern, um den Unterschied zwischen DecimalField und FloatField herauszufinden. Das von Seth angesprochene Float-Rounding-Problem ist ein Problem für die Währung.
Die Django Docs Staaten
Hier sind weitere Unterschiede zwischen den beiden Feldern:
DecimalField:
<class 'decimal.Decimal'>
Mehr zu DecimalField aus den Django Docs .
FloatField:
<type 'float'>
Mehr zu FloatField aus den Django Docs .
Gilt für beide:
Ich bin auf diese Frage gestoßen, als ich nach dem Unterschied zwischen den beiden Feldern gesucht habe, also denke ich, dass dies denjenigen in der gleichen Situation helfen wird :)
UPDATE: Um die Frage zu beantworten, denke ich, dass Sie mit beiden davonkommen können, um die Währung darzustellen, obwohl Dezimal viel besser passt. Es gibt ein Rundungsproblem, wenn es um Gleitkommazahlen geht. Sie müssen es also verwenden
round(value, 2)
, um Ihre Gleitkommadarstellung auf zwei Dezimalstellen gerundet zu halten. Hier ist ein kurzes Beispiel:>>> round(1.13 * 50 + .01, 2) 56.51
Sie können immer noch Probleme mit Float und Round bekommen. Wie hier sehen wir es auf einen Wert von 5 abrunden:
>>> round(5.685, 2) 5.68
Aber in diesem Fall wird es abrunden:
>>> round(2.995, 2) 3.0
Es hat alles damit zu tun, wie der Float im Speicher gespeichert ist. Siehe hier .
quelle
Ich weiß, dass dies super alt ist, aber ich bin darauf gestoßen und habe nach etwas völlig anderem gesucht, und ich wollte da rauswerfen, dass es im Allgemeinen nicht ratsam ist, Gleitkommazahlen (Gleitkomma- oder Dezimalzahlen) als Währung zu verwenden, wie es die mathematische Gleitkomma-Rundung tun wird führen immer zu kleinen Berechnungsfehlern, die im Laufe der Zeit zu sehr großen Abweichungen führen können.
Verwenden Sie stattdessen ein Ganzzahlfeld oder eine Zeichenfolge nach Ihren Wünschen. Multiplizieren Sie Ihre Währung, um die Dezimalstelle an das Ende zu verschieben, und geben Sie beim Speichern eine ganze Zahl ein. Verschieben Sie diese Dezimalstelle dann wieder dorthin, wo sie hingehört, wenn Sie sie anzeigen müssen. Auf diese Weise behandeln Banken (und die meisten Währungsbibliotheken) Daten und ersparen Ihnen später jede Menge Ärger.
Ich habe das auf die harte Tour gelernt, weil es nicht wirklich ein allgemeines Thema ist. Vielleicht erspart dies jemand anderem, dasselbe zu tun.
quelle
Bearbeiten: Das Satchmo-Projekt ist nicht mehr aktiv. Sehen Sie sich diese Alternativen für den Umgang mit Währungen an
Das in Django ansässige Satchmo-Projekt verfügt über ein CurrencyField und ein CurrencyWidget, die einen Blick wert sind.
Überprüfen Sie das App-Verzeichnis satchmo_utils auf die Quelle
quelle