Ich habe einen riesigen Haufen älteren Codes geerbt, der in PHP auf einer MySQL-Datenbank geschrieben wurde. Mir ist aufgefallen, dass die Anwendung doubles
Daten speichert und bearbeitet.
Nun bin ich auf zahlreiche Beiträge gestoßen, in denen erwähnt wurde, dass sie double
aufgrund von Rundungsfehlern nicht für Geldgeschäfte geeignet sind. Ich habe jedoch noch keine vollständige Lösung gefunden, wie monetäre Werte in PHP-Code behandelt und in einer MySQL-Datenbank gespeichert werden sollen.
Gibt es eine bewährte Methode für den Umgang mit Geld speziell in PHP?
Dinge, die ich suche, sind:
- Wie sollen die Daten in der Datenbank gespeichert werden? Spaltentyp? Größe?
- Wie sollen die Daten bei normaler Addition, Subtraktion behandelt werden. Multiplikation oder Division?
- Wann sollte ich die Werte runden? Wie viel Rundung ist akzeptabel, wenn überhaupt?
- Gibt es einen Unterschied zwischen dem Umgang mit hohen und niedrigen Geldwerten?
Hinweis: Ein SEHR vereinfachter Beispielcode, wie ich im Alltag auf Geldwerte stoßen könnte (verschiedene Sicherheitsbedenken wurden zur Vereinfachung ignoriert. Natürlich würde ich meinen Code im wirklichen Leben niemals so verwenden):
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
Ich hoffe, dass Sie diesen Beispielcode verwenden, um mehr Anwendungsfälle herauszubringen und ihn nicht wörtlich zu nehmen.
Bonus - Frage Wenn ich ein ORM wie Lehre oder PROPEL zu verwenden, wie anders wird es Geld in meinem Code zu verwenden sein.
decimal
Typ in C # hat eine begrenzte Genauigkeit, ist aber perfekt für Geldwerte geeignet.