2009-07-04 3 views
17

Also, ich plane, eine Anwendung (PHP/MySQL) zu machen, die viel mit Geld beschäftigt, und ich denke darüber nach, wie man mit dem Geld speichert und operiert, unter Bezugnahme auf PHP float data type und MySQL decimal.PHP/MySQL: Beste Geldoperationen/Speicherpraktiken?

Ich dachte an zwei Optionen. Eine davon ist das Betreiben und Speichern von Geld im Integer-Cents-Format ($ dollars * 100), um sich nicht mit Float-in-exprections auseinanderzusetzen und es als Integer in der DB zu speichern. Der andere ist, in DB als Dezimal zu speichern und BC Math in PHP für Berechnungen zu verwenden.

So googelte ich die ganze Nacht, um herauszufinden, welche die beste Option zu verwenden ist und keine klare Antwort gefunden. Die einzige vernünftige Option, die ich gesehen habe, war die Ganzzahl Cents One (was ich nicht wirklich mag, weil es vor jeder Anzeige im Browser und vor dem Speichern in der DB eine Menge Konvertierung von Dollar in Cent und umgekehrt bedeuten würde) .

Auch haben sich Leute über MySQL dezimal beschwert (MySQL speichert Dezimalzahlen als Strings, betreibt sie als Floats usw.), aber das waren alte Posts. Laut der MySQL-Dokumentation behandelt die aktuelle Version Dezimalzahlen korrekt. Die einzige Beschwerde bestand darin, dass sie den Anteil der Werte schneidet, der die deklarierte Bruchlänge überschreitet (zB wenn Sie einen Wert von 12.326 in einer deklarierten Spalte speichern (9,2)). , aber von meinen Nachforschungen rundet es ab, anstatt nur abzuschneiden (12.326 wird zu 12.33), was meiner Meinung nach richtig ist.

Und ich habe keine Empfehlung gefunden, Geld als Dezimalzahlen zu speichern und Berechnungen mit PHP BCMath durchzuführen, und meiner Meinung nach ist das so, weil nur wenige Leute von BC und GMP mathematischen Funktionen wissen.

Also, was wäre die beste Option zu verwenden, in Anbetracht Präzision, Geschwindigkeit (BCMath Berechnungen Geschwindigkeit, MySQL Dezimalgeschwindigkeit vs Integer) und Programmierkomfort?

+0

Obwohl er ein wenig spät für die OP, für alle Interessierten, ich Open-Source eine [PHP Money-Bibliothek] (https://github.com/brick/money), die sichere Berechnungen für Geldbeträge jeder Größe durchführt, wobei reines PHP, GMP oder BCMath basierend auf den verfügbaren Daten verwendet wird. Oh, und ich speichere meine Gelder als Ganzzahlen in der Datenbank. – Benjamin

Antwort

4

Ich würde definitiv für die Verwendung von Ints und Routing alles über eine Datenobjekt (ORM) -Stil, die dann alle Konvertierung für Sie behandelt. Der Client-Code, der das Datenobjekt verwendet, wird niemals eine Konvertierung durchführen müssen, und es ist Ihnen egal, während Sie keine Probleme mit dem Speicher haben, da die Eingaben von der Datenbank einfach gehandhabt werden können. Darüber hinaus können Sie ganz einfach weitere Methoden hinzufügen, die für das Geldobjekt erforderlich sind (z. B. Konvertierungen zwischen Geldarten usw.).

+0

+1 für das Speichern von Geld als Ganzzahl. Dies funktioniert gut mit mehreren Währungen: Speichern Sie das Geld zusammen mit dem Währungscode, und es ist Ihnen plötzlich egal, ob Sie für Ihre "DECIMAL" 2 Dezimalstellen (für USD) oder 0 Dezimalstellen (für JPY) verwenden sollten. USD 123,00 wird als [12300, 'USD'] gespeichert, während JPY 123 als [123, 'JPY'] gespeichert wird. Und natürlich ** nutze niemals Float in irgendeinem Teil deiner geldbezogenen Berechnungen oder Speicherung **. – Benjamin