2009-05-23 8 views
8

Ich arbeite an einigen Bericht Ausgabeskripts, die einige rudimentäre Berechnungen für einige Geldwerte durchführen müssen.Wie führe ich sicher geldbezogene Berechnungen in PHP durch?

Ich kenne die Einschränkungen der Gleitkommaarithmetik für diesen Zweck, aber die Eingabewerte sind alle in einem Dezimalformat, also wenn ich die arithmetischen Operatoren für sie verwende, wird PHP sie in Floats umwandeln.

Also, was ist der beste Weg, um die Zahlen zu behandeln? Sollte ich BCMath verwenden? Gibt es in .NET etwas Ähnliches wie Decimal? Oder ist es sicher, die arithmetischen Operatoren zu verwenden, wenn ich in int zurückwechsle?

+0

Es ist der Grund, warum Cobol immer noch stark in finanziellen verwendet wird. Sie können problemlos mit Dezimalzahlen arbeiten. –

Antwort

10

Arbeiten Sie nicht in Dollars (1,54 $), arbeiten 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!

+9

Generalisierung: Verwenden Sie eine Einheit, die für Ihre Währung atomar ist. – SingleNegationElimination

+0

Um eine Währung umzurechnen, stellen Banken uns Kurse mit 8 Dezimalstellen zur Verfügung. –

+0

Wie sieht es mit der Anzeige aus? Es muss immer noch als 1,54 $ angezeigt werden. Gibt es irgendeine Situation mit einer Gleitkommazahl, bei der ich mit 1.53 oder 1.55 enden werde? – Shabbyrobe

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.

-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 Berechnungen.

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 editiert, um zu erwähnen, dass, wenn PHP eine Zahl jenseits der Grenzen des Integer-Typs findet, diese interpreted as a float instead ist. Aber dann bist du zurück zu deinem ursprünglichen Problem der Verwendung von Fließkomma!) Beliebige Längen-Integer (GMP, davon referenziert) Seite) kann helfen.)

Grundsätzlich funktioniert dies in einer halbherzigen Weise in den meisten Fällen und ist billig; es richtig zu machen ist ein ernster Schmerz. Mein Vorschlag ist, dies als ein Geschäftsproblem zu betrachten: Wenn jemand sich darüber beschwert, dass er einen Cent verpasst hat, geben Sie ihm einen Dollar und machen Sie sich keine Mühe, mit einer echten Lösung zu beginnen, bis Sie dadurch mehr Geld sparen.

+2

Das ist falsch. Gleitende Punkte können nicht alle Basis-10-Nummern darstellen. Selbst mit kleinen Zahlen und einfacher Addition/Subtraktion können Sie falsche Ergebnisse erhalten. – troelskn

+0

Abgerundete Gleitkommazahlen können alle Zahlen zwischen 0,01 und 1,00 darstellen (beachten Sie die signifikanten Stellen dort). –

Verwandte Themen