Manchmal verwirren mich Activerecord-Datentypen. Ähm, oft. Eine meiner ewigen Fragen ist für einen bestimmten Fall:
Soll ich verwenden
:decimal
oder:float
?
Ich bin oft auf diesen Link gestoßen , ActiveRecord :: decimal vs: float? , aber die Antworten sind nicht klar genug, um sicher zu sein:
Ich habe viele Threads gesehen, in denen Leute empfehlen, niemals float und immer dezimal zu verwenden. Ich habe auch Vorschläge von einigen Leuten gesehen, float nur für wissenschaftliche Anwendungen zu verwenden.
Hier einige Beispielfälle:
- Geolokalisierung / Breite / Länge:
-45.756688
,120.5777777
, ... - Ratio / Prozentsatz:
0.9
,1.25
,1.333
,1.4143
, ...
Ich habe :decimal
in der Vergangenheit verwendet, aber ich fand, dass der Umgang mit BigDecimal
Objekten in Ruby im Vergleich zu einem Float unnötig umständlich war. Ich weiß auch, dass ich :integer
zum Beispiel Geld / Cent darstellen kann, aber es passt nicht ganz für andere Fälle, zum Beispiel wenn sich Mengen, in denen sich die Genauigkeit ändert, im Laufe der Zeit ändern könnten.
- Was sind die Vor- und Nachteile der Verwendung?
- Was wären gute Faustregeln, um zu wissen, welcher Typ verwendet werden soll?
quelle
+1.43*2^10
lieber als+1.43*10^2
?In Rails 3.2.18 wird: decimal bei Verwendung von SQLServer zu: integer, in SQLite funktioniert dies jedoch einwandfrei. Der Wechsel zu: float hat dieses Problem für uns gelöst.
Die gewonnene Erkenntnis lautet: "Verwenden Sie immer homogene Entwicklungs- und Bereitstellungsdatenbanken!"
quelle
In Rails 4.1.0 hatte ich Probleme beim Speichern von Längen- und Breitengraden in der MySQL-Datenbank. Es kann keine große Bruchzahl mit dem Datentyp float speichern. Und ich ändere den Datentyp auf dezimal und arbeite für mich.
quelle
decimal(13,9)
ist ausreichend für Breiten- und Längengrade. @ScottW: Ich erinnere mich nicht, aber wenn Postgres IEEE-Floats verwendet, funktioniert es nur "gut", weil Sie noch keine Probleme haben ... NOCH. Es ist ein unzureichendes Format für Längen- und Breitengrade. Yo wird schließlich Fehler in den niedrigstwertigen Ziffern haben.