2013-03-31 22 views

Antwort

58

Numeric mit erzwungener Genauigkeit von 2 Einheiten. Verwenden Sie niemals float oder float wie Datentyp, um Währung darzustellen, denn wenn Sie dies tun, werden die Leute unglücklich sein, wenn die Bilanz des Finanzberichts um + oder - ein paar Dollar falsch ist.

Das Geld-Typ ist nur aus historischen Gründen so weit ich kann sagen.

+1

Das ist nicht, warum Sie Fließkomma vermeiden. Gerade Numerisch wird Rundungsfehler haben, wenn Sie durch etwas teilen, das nicht in eine Zehnerpotenz unterteilt ist, egal welche Genauigkeit Sie verwenden. (Genauigkeit von 2 ist sowieso eine schlechte Idee ... überprüfen Sie die Dokumente.) – Doradus

39

Zur Auswahl stehen:

  1. integer: Speichern Sie den Betrag in Cent. Dies ist, was EFTPOS-Transaktionen verwenden.
  2. decimal(12,2): Speichern Sie den Betrag mit genau zwei Dezimalstellen. Das, was die meisten Hauptbuch-Software verwendet.
  3. float: schreckliche Idee - unzureichende Genauigkeit. Dies ist, was naive Entwickler verwenden.

Option 2 ist die gebräuchlichste und am einfachsten zu arbeiten. Machen Sie die Präzision (12 in meinem Beispiel, also insgesamt 12 Ziffern) so groß oder klein, wie es für Sie am besten ist.

Beachten Sie, dass wenn Sie mehrere Transaktionen, die das Ergebnis einer Berechnung (z. B. mit einem Wechselkurs) waren, zu einem einzelnen Wert mit Geschäftsbedeutung zusammenfassen, sollte die Genauigkeit höher sein, um einen genauen Makrowert zu erhalten. Überlegen Sie, ob Sie etwas wie decimal(18, 8) verwenden, damit die Summe genau ist und die einzelnen Werte für die Anzeige auf Cent-Genauigkeit gerundet werden können.

+2

Wenn Sie mit irgendeiner Art von Steuerrückrechnung oder Devisen arbeiten, benötigen Sie mindestens 4 Dezimalstellen oder Sie werden Daten verlieren. Also ist 'numerisch (15,4) 'oder' numerisch (15,6) 'eine gute Idee. –

+1

Es gibt eine vierte Option - das heißt, einen String zu verwenden und einen gleichwertigen, nicht verlustbehafteten Dezimaltyp in der Hostsprache zu verwenden. – ioquatix

72

Ihre Quelle ist in keiner Weise offiziell. Es stammt aus dem Jahr 2011 und ich erkenne die Autoren nicht einmal. Wenn die Geldart "entmutigt" wurde, würde PostgreSQL dies im Handbuch - which it doesn't - sagen.

Für eine offizielle Quelle, lesen this thread in pgsql-general (from just this week!), mit Aussagen von Kernentwickler einschließlich D'Arcy JM Cain (ursprüngliche Autor des Geld-Typ) und Tom Lane:

Grundsätzlich money hat seine (haftungsbeschränkt) Verwendet. Der Vorteil gegenüber numeric ist Leistung.

decimal ist nur ein Pseudonym für numeric in Postgres.

Verwandte Antwort (und Kommentare!) Über Verbesserungen in den letzten Releases:

Ich persönlich mag Währung als integer darstellt Cents speichern. Das ist effizienter als jede andere der genannten Möglichkeiten.

+3

Es gibt mehrere Diskussionen auf den Mailinglisten, die den Eindruck erwecken, dass der Geldtyp zumindest nicht empfehlenswert ist, zB: http://postgresql.nabble.com/Money-type-todos-td1964190.html#a1964192 plus um fair zu sein: das Handbuch für Version 8.2 ** hat es ** veraltet genannt: http://www.postgresql.org/docs/8.2/static/datatype-money.html –

+1

@a_horse_with_no_name: Dein Link ist zu einem Thread von 2007, wo auch Version 8.2 die aktuelle Version war und der Typ "Geld" in der Tat veraltet war. Probleme wurden behoben und der Typ wurde in späteren Versionen hinzugefügt. Persönlich mag ich es, Währung als "Ganzzahl" zu speichern, die Cents darstellt. –

+0

Erwin, Sie können aus einer Datenbankperspektive allein richtig denken. Allerdings, wenn Sie Postgresql + Java kombinieren, ist es überhaupt nicht gut (aus meiner Erfahrung). Als ich Ihren Kommentar gelesen habe, habe ich für die meisten meiner Währungsfelder MONEY verwendet und jetzt bekomme ich diese Java-Ausnahme: "** SQLException ist aufgetreten: org.postgresql.util.PSQLException: Falscher Wert für double: 2.500.00 **". Ich habe gegoogelt und keine gute Lösung gefunden, also bin ich in die langweilige Aufgabe, sie alle in NUMERIC oder DECIMAL zu verwandeln !!! –

8

Ich halte alle meine Geld-Felder wie:

numeric(15,6)

Es scheint übertrieben, dass viele Dezimalstellen zu haben, aber wenn es auch nur die geringste Chance, dass Sie mit mehreren Währungen umgehen müssen werden Sie brauche so viel Präzision beim Konvertieren. Egal, was ich einem Benutzer vorstelle, ich speichere immer nach US-Dollar. Auf diese Weise kann ich leicht in jede andere Währung umrechnen, wenn man den Umrechnungskurs für den betreffenden Tag zugrunde legt.

Wenn Sie nie etwas anderes als eine Währung tun, ist das Schlimmste hier, dass Sie ein wenig Platz verschwendet haben, um einige Nullen zu speichern.

+0

Dies birgt das Risiko falscher Ergebnisse wegen fehlender Kürzung. Wenn Werte ungleich Null versehentlich in die verbleibenden Dezimalstellen fließen, z. B. ein Preisfeld mit 0,333333 Dollar, kann das System das Ergebnis eines Kaufs von 3 Artikeln zu je 0,33 $ anzeigen, was insgesamt bis zu 1,00 statt 0,99 entspricht. – Peteris

+0

Perteris, was schlagen Sie stattdessen vor? Egal, wie viel Präzision Sie bei dieser Rundung werfen, kann ein Problem sein. Ich habe einfach keinen besseren Weg gefunden, auch wenn dieser nicht ideal ist. –

+0

Fixpunkt und abgeschnitten, wo immer es angebracht ist. Sobald Sie einen "speicherbaren" Geldwert erreichen, z. Ein Preis, der einem Kunden angeboten wird, sollte in angemessenen Metriken liegen, die in den meisten Fällen im Standard-Einzelhandelsumfeld in ganzen Cent liegen. Wenn Sie unterschiedliche Geschäftsanforderungen haben (z.Preis von Großserienware pro Stück) es könnte eine andere Einstellung der Genauigkeit geben, aber Sie müssen die * Präsentation zusammen mit dem Speicher * behandeln - wenn Sie die Geldnummer mit x Dezimalstellen (oder umgekehrt, z. B. in ganzen Tausend) dann anzeigen Sie müssen es auch mit * dieser * Genauigkeit speichern, nicht weniger, aber auch nicht mehr. – Peteris

Verwandte Themen