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
Die FloatField-Klasse wird manchmal mit der DecimalField-Klasse verwechselt. Obwohl beide reelle Zahlen darstellen, repräsentieren sie diese Zahlen unterschiedlich. FloatField verwendet intern den Float-Typ von Python, während DecimalField den Decimal-Typ von Python verwendet. Lesen Sie hier mehr .
Hier sind weitere Unterschiede zwischen den beiden Feldern:
DecimalField:
- DecimalFields muss ein Attribut 'decimal_places' und ein Attribut 'max_digits' definieren.
- Sie erhalten zwei Freiformvalidierungen, die hier enthalten sind, aus den oben genannten erforderlichen Attributen. Wenn Sie also max_digits auf 4 setzen und eine Dezimalzahl von 4,00000 (5 Stellen) eingeben, wird folgende Fehlermeldung angezeigt: Stellen Sie sicher, dass nicht mehr als 4 vorhanden sind Ziffern insgesamt.
- Sie erhalten auch eine ähnliche Formularüberprüfung für Dezimalstellen (die in den meisten Browsern auch am Frontend mithilfe des step-Attributs im Eingabefeld überprüft wird. Wenn Sie decimal_places = 1 festlegen und 0,001 als Wert eingeben, wird eine Fehlermeldung angezeigt dass der Mindestwert 0,1 sein muss.
- Gibt eine Dezimalzahl zurück. Dezimal, Typ ist
<class 'decimal.Decimal'>
- Hat keine zusätzliche Validierung als DecimalField
- Bei einem Dezimaltyp wird die Rundung aufgrund der erforderlichen Attribute, die wie oben beschrieben festgelegt werden müssen, auch für Sie behandelt. Also aus der Shell, wenn Sie
- In der Datenbank (postgresql) wird das DecimalField als numerischer Typ (max_digits, decimal_laces) gespeichert und der Speicher als "main" festgelegt. Im obigen Beispiel ist der Typ numerisch (4,1).
Mehr zu DecimalField aus den Django Docs .
FloatField:
- Gibt den eingebauten Float-Typ zurück.
<type 'float'>
- Keine intelligente Rundung und kann tatsächlich zu Rundungsproblemen führen, wie in Seths Antwort beschrieben.
- Verfügt nicht über die zusätzliche Formularüberprüfung, die Sie von DecimalField erhalten
- In der Datenbank (postgresql) wird das FloatField als Typ mit "doppelter Genauigkeit" gespeichert und der Speicher als "normal" festgelegt.
Mehr zu FloatField aus den Django Docs .
Gilt für beide:
- Beide Felder erstrecken sich von der Klasse "Field" und können "blank", "null", "verbose_name", "name", "primary_key", "max_length", "unique", "db_index", "rel", "default" akzeptieren ',' editierbar ',' serialisieren ',' unique_for_date ',' unique_for_month ',' unique_for_year ',' selection ',' help_text ',' db_column ',' db_tablespace ',' auto_created ',' validators ',' error_messages ' , wie alle Felder, die sich von "Feld" erstrecken, haben würden.
- Das Standard-Formular-Widget für beide Felder ist ein TextInput.
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 .
>>> 10.50 - 0.20
in Python 2.7 bekommen10.3
.