Wie führe ich Berechnungen im Zusammenhang mit Geld in PHP sicher aus?

8

Ich arbeite an einigen Report Output Scripts, die einige rudimentäre Berechnungen für einige Geldwerte durchführen müssen.

Ich kenne die Einschränkungen der Fließkomma-Arithmetik für diesen Zweck, aber die Eingabewerte sind alle in einem Dezimalformat. Wenn ich also die arithmetischen Operatoren für sie verwende, wirft PHP sie in floats.

Was ist der beste Weg, mit den Zahlen umzugehen? Soll ich BCMath verwenden? Gibt es etwas in Dezimal in .NET? Oder ist es sicher, die arithmetischen Operatoren zu verwenden, wenn ich in int zurückwürfe?

    
Shabbyrobe 23.05.2009, 02:07
quelle

3 Antworten

10

Arbeite nicht in Dollars (1,54 $), arbeite in Cent: (154c). Wenn Sie keine Aufgaben ausführen müssen, bei denen Bruchteile von Cent wichtig sind, arbeiten Sie mit ganzen Zahlen, und alles ist gut. Wenn Sie an Zehntel Cent interessiert sind, dann multiplizieren Sie einfach alles mit zehn!

    
nickf 23.05.2009, 02:49
quelle
8

Wenn Sie BCMath verwenden, werden alle Werte in Strings gespeichert und als String an die Funktionen übergeben, genauso wie das Ergebnis eine Zeichenkette ist. Sie müssen also kein Casting durchführen, sondern sicherstellen, dass die der Funktion zugewiesene Zahl ein numerischer Wert ist. Wenn die Mathematik eine hohe Genauigkeit auf der Dezimalseite erfordert, dann verwenden Sie BCMath.

    
Robert K 23.05.2009 02:29
quelle
-4

Wenn Sie mit vernünftigen Beträgen arbeiten (zu einer "normalen Person"), ist die Verwendung von Gleitkommazahlen wahrscheinlich kein Problem, insbesondere wenn Sie nur Beträge addieren und subtrahieren, anstatt z. B. Zinsberechnungen durchzuführen .

Wenn Sie nach einer schnellen Lösung suchen, wird Ihnen der Wechsel zu Integer wahrscheinlich nicht helfen; Sie müssen immer noch mit Überlauf umgehen. (Jemand hat hier bearbeitet, um zu erwähnen, dass, wenn PHP auf eine Zahl jenseits der Grenzen des Integer-Typs stößt, stattdessen als Float interpretiert wird Aber dann sind Sie zurück zu Ihrem ursprünglichen Problem der Verwendung von Gleitkomma!) Beliebige Längen-Integer (GMP, von dieser Seite referenziert) können helfen.)

Im Grunde genommen funktioniert das in den meisten Fällen und ist billig; es richtig zu machen ist ein ernster Schmerz. Ich schlage vor, dies als ein Geschäftsproblem zu betrachten: Wenn sich jemand beschwert, einen Cent zu verpassen, geben Sie ihm einen Dollar, und machen Sie sich keine Mühe, mit einer echten Lösung anzufangen, bis Sie dadurch mehr Geld sparen.

    
Curt J. Sampson 23.05.2009 06:17
quelle

Tags und Links