73 Stimmen

Beste Möglichkeit, Währungswerte in C++ zu speichern

Ich weiß, dass ein Float aufgrund von Rundungsfehlern nicht geeignet ist, um Währungswerte zu speichern. Gibt es eine Standardmethode zur Darstellung von Geld in C++?

Ich habe in der Boost-Bibliothek nachgesehen und nichts darüber gefunden. In Java scheint es, dass BigInteger der Weg ist, aber ich konnte kein Äquivalent in C++ finden. Ich könnte meine eigene Geldklasse schreiben, ziehe es aber vor, dies nicht zu tun, wenn es etwas getestet wird.

4voto

Douglas Mayle Punkte 19645

Dies hängt von Ihren geschäftlichen Anforderungen in Bezug auf die Rundung ab. Am sichersten ist es, eine ganze Zahl mit der erforderlichen Genauigkeit zu speichern und zu wissen, wann/wie aufgerundet werden soll.

2voto

Loren Pechtel Punkte 8729

Integers, immer - speichern Sie es als Cent (oder was auch immer Ihre niedrigste Währung ist, wo Sie für programmieren.) Das Problem ist, dass egal, was Sie mit Fließkomma irgendwann finden Sie eine Situation, wo die Berechnung wird anders, wenn Sie es in Fließkomma tun. Runden in letzter Minute ist keine Lösung, da echte Währungsberechnungen im Laufe der Zeit gerundet werden.

Das Problem lässt sich auch nicht dadurch vermeiden, dass man die Reihenfolge der Operationen ändert - das funktioniert nicht, wenn man einen Prozentsatz hat, der keine richtige binäre Darstellung zulässt. Buchhalter werden ausflippen, wenn Sie um einen einzigen Cent daneben liegen.

1voto

Jeffrey L Whitledge Punkte 55524

Ich würde empfehlen, ein long int zu verwenden, um die Währung in der kleinsten Stückelung zu speichern (z. B. amerikanisches Geld wäre Cents), wenn eine dezimal basierte Währung verwendet wird.

Sehr wichtig: Achten Sie darauf, dass Sie alle Währungswerte so benennen, wie sie tatsächlich sind. (Beispiel: account_balance_cents) So vermeiden Sie später eine Menge Probleme.

(Ein weiteres Beispiel, bei dem dies zum Tragen kommt, sind Prozentsätze. Nennen Sie niemals einen Wert "XXX_Prozent", wenn er tatsächlich ein Verhältnis enthält, das nicht mit hundert multipliziert ist).

1voto

Laurie Punkte 1

Die Lösung ist einfach: Speichern Sie die Daten mit der erforderlichen Genauigkeit als verschobene Ganzzahl. Beim Einlesen werden sie jedoch in eine doppelte Fließkommazahl umgewandelt, so dass bei den Berechnungen weniger Rundungsfehler auftreten. Beim Speichern in der Datenbank multiplizieren Sie dann mit der erforderlichen ganzzahligen Genauigkeit, fügen aber vor dem Abschneiden als Ganzzahl +/- 1/10 hinzu, um Abschneidefehler auszugleichen, oder +/- 51/100 zum Runden. Kinderleicht.

0voto

Chris Cudmore Punkte 28967

Eine Möglichkeit besteht darin, $10,01 als 1001 zu speichern und alle Berechnungen in Pennies durchzuführen, wobei die Werte bei der Anzeige durch 100D geteilt werden.

Oder Sie verwenden Puffer und runden erst im letzten Moment.

Oft lassen sich die Probleme durch eine Änderung der Reihenfolge der Vorgänge entschärfen.

Verwenden Sie anstelle von Wert * 0,10 für einen Rabatt von 10 % (Wert * 10)/100, was eine erhebliche Erleichterung darstellt. (denken Sie daran, dass .1 eine sich wiederholende Binärzahl ist)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X