MongoDB - Was ist mit den Decimal-Datentyp von Wert?
Ich bin derzeit am erlernen und anwenden von MongoDB für eine kleine finanzielle zugehörige Projekt.
Wenn ich lese MongoDB in Actiones sagt:
Das einzige andere Problem, das Häufig entsteht, mit BSON-numerischen Typen ist
das fehlen von dezimal-Unterstützung. Dies bedeutet, dass, wenn Sie planen,
die Speicherung Währung Werte in MongoDB verwenden, benötigen Sie einen integer-Typ
und halten Sie die Werte in Cent.
Meine finanziellen Verwandte Produkt beinhaltet einige Währung Werte, aber ich bin wenig verwirrt oder besorgt über die obige Aussage. Hier sind meine Fragen:
- Kann ich
double
für diejenigen, diecurrency values
in meinem Projekt? - Was passieren wird, oder ist die Folgen, wenn ich direkt verwenden
double
für Sie? - Wenn der decimal-Datentyp ist ein muss-haben Ding für Finanzprodukt ist das eine schlechte Idee, MongoDB?
- Was bedeutet es
you need to use an integer type and keep the values in cents
? Bedeutet es, dass, wenn ich werde zu speichern1.34 dollars
dann sollte ich speichern134 cents
?
Dank
InformationsquelleAutor der Frage Jackson Tale | 2012-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, eine exakte Darstellung für finanzielle Zwecke, dann verdoppelt oder floating-point Werte sind ungeeignet, da die Bruch-Teile sind mit Rundung Fehler. Bestimmte dezimale Werte können nicht dargestellt werden binary-basierten floating-Punkte und müssen angeglichen werden.
Für eine weniger technische, intro, siehe Das Problem mit der Rundung von Gleitkommazahlen; wenn Sie wollen, geek out, dann Lesen Sie Was Jeder Computer Scientist Should Know About Floating-Point Arithmetic.
Die Empfehlung der Verwendung eines integer-Typ (speichern der Werte in Cent) ist zu vermeiden, dass potenzielle Rundungsfehler. Dieser Ansatz wird beschrieben als "Mit einem Scale-Faktor" in der MongoDB-Dokumentation für Modellierung monetären Daten und ist ein allgemeiner workaround für MongoDB 3.2 und früher.
MongoDB 3.4 enthält eine neue Dezimal-BSON-Typ bietet genaue Präzision für die Bearbeitung monetären Daten Felder.
InformationsquelleAutor der Antwort Stennie
Wenn Sie nicht möchten, zu speichern, Währung, cent-Werte, die Sie speichern könnte eine Währung von $1,34 die ein Objekt wie dieses:
Tun, jede Mathematik mit Objekten wie diesem nicht einfach werden würde und nicht kommerziellen Rundungsregeln. Aber man sollte nicht jede business-Logik auf dem Datenbank sowieso, vor allem nicht, wenn es eine "dumme" Datenbank wie MongoDB.
Was Sie tun sollten, ist serialisieren/Deserialisieren diese Objekte von/zu einem
Money
- Klasse in Ihrer Anwendung, die implementiert die grundlegende Währung mathematische Operationen Beachtung der Rundungsregeln und löst eine Ausnahme aus, wenn Sie versuchen, eine operation mit verschiedenen Währungseinheiten ($12.34 + 14.95€ = error
- muss wandeln eine Währung in eine andere Währung zuerst durch die Bereitstellung eines exchange-rate).InformationsquelleAutor der Antwort Philipp
Wenn Sie mit Mungo, dann können Sie getter/setter-Funktionen, die in der schema-definition z.B.
Anwendbar, um ein Schemaobjekt, wie
Die Anzahl von Nullen zu multiplizieren/dividieren, hängt von der Genauigkeit, die Sie wollen.
InformationsquelleAutor der Antwort HNyang
Sieht aus wie MongoDB hat schließlich die Unterstützung für Dezimalzahlen, obwohl zum Zeitpunkt des Schreibens ist dies nur die Entwicklung abgeschlossen, aber ich hoffe, es sollte sehr bald verfügbar sein in der stabilen version 3.4?).
https://jira.mongodb.org/browse/SERVER-1393
InformationsquelleAutor der Antwort arva
Ich weiß, dieser Beitrag ist alt, aber Sie einen hohen Rang in Google so...
Die beste Lösung für die Speicherung von Finanzdaten ist mit genau der Präzision, wie beschrieben, von MongoDB selbst hier http://docs.mongodb.org/v2.6/tutorial/model-monetary-data/#monetary-value-exact-precision.
Und wenn Sie Sie brauchen, die Daten durch dividieren durch 100 angenommen, Sie wollen 2-stelliger Präzision. Der Nachteil ist, dass Sie immer arbeiten müssen mit der gleichen Präzision.
InformationsquelleAutor der Antwort heavenleft
MongoDb Unterstützung für Decimal-Datentyp in version 3.4. Es ist auch von der shell.
InformationsquelleAutor der Antwort Salvador Dali