PHP / MySQL: Best Money Operations / Speicherpraktiken?

Ich plane also eine Anwendung (PHP / MySQL) zu erstellen, die viel Geld kostet, und ich denke darüber nach, wie ich mit dem Geld umgehen und es speichern kann, wobei ich mich auf den PHP-Float-Datentyp und die MySQL-Dezimalzahl beziehe.

Ich dachte an zwei Möglichkeiten. Eine davon besteht darin, Geld im Ganzzahl-Cent-Format (100 US-Dollar *) zu betreiben und zu speichern, um Float-Ungenauigkeiten zu vermeiden und es auch als Ganzzahl in der Datenbank zu speichern. Die andere besteht darin, in DB als Dezimalzahl zu speichern und BC Math in PHP für Berechnungen zu verwenden.

Also habe ich die ganze Nacht gegoogelt, um herauszufinden, welche Option die beste ist, und keine klare Antwort gefunden. Die einzige vernünftige Option, die ich gesehen habe, war die Ganzzahl-Cent-Option (die ich nicht wirklich mag, da sie vor jeder Anzeige im Browser und vor dem Speichern in der DB viel von Dollar in Cent und umgekehrt konvertieren würde).

Außerdem haben sich die Leute über MySQL-Dezimalzahlen beschwert (MySQL speichert Dezimalzahlen als Zeichenfolgen, bedient sie als Floats usw.), aber das waren alte Posts. Laut MySQL-Dokumentation behandelt die aktuelle Version Dezimalzahlen korrekt. Die einzige Beschwerde war, dass der Bruchteil der Werte, der die angegebene Bruchlänge überschreitet, abgeschnitten wird (z. B. wenn Sie einen Wert von 12.326 in einer als Dezimalzahl deklarierten Spalte (9,2) speichern). , aber nach meinen Untersuchungen rundet es es, anstatt nur abzuschneiden (12.326 wird 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. Meiner Meinung nach sind dies nur wenige, die sich mit BC- und GMP-Mathematikfunktionen auskennen.

Also, was wäre die beste Option, wenn man Präzision, Geschwindigkeit (BCMath-Berechnungsgeschwindigkeit, MySQL-Dezimalgeschwindigkeit vs. Ganzzahl) und Programmierkomfort berücksichtigt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage