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.

9voto

Fernando Punkte 1090

Sie sagen, Sie hätten in der Boost-Bibliothek nachgeschaut und dort nichts gefunden. Aber dort haben Sie multiprecision/cpp_dec_float die besagt:

Die Radix dieses Typs ist 10. Infolgedessen kann er sich subtil anders verhalten als Basis-2-Typen.

Also, wenn Sie bereits mit Boost, sollte dies gut sein, um Währungs-Werte und Operationen, wie seine Basis 10 Zahl und 50 oder 100 Stellen Präzision (eine Menge).

Siehe:

#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_dec_float.hpp>

int main()
{
    float bogus = 1.0 / 3.0;
    boost::multiprecision::cpp_dec_float_50 correct = 1.0 / 3.0;

    std::cout << std::setprecision(16) << std::fixed 
              << "float: " << bogus << std::endl
              << "cpp_dec_float: " << correct << std::endl;

    return 0;
}

Ausgabe:

Schwimmer: 0,3333333432674408

cpp_dec_float: 0.3333333333333333

*Ich sage nicht, dass Float (Basis 2) schlecht und Decimal (Basis 10) gut ist. Sie verhalten sich nur unterschiedlich...

** Ich weiß, dass dies ein alter Beitrag ist und boost::multiprecision im Jahr 2013 eingeführt wurde, daher wollte ich es hier anmerken.

9voto

Piotr Punkte 211

Sie können den dezimalen Datentyp ausprobieren:

https://github.com/vpiotr/decimal_for_cpp

Entwickelt für die Speicherung von geldbezogenen Werten (Geldsaldo, Währungskurs, Zinssatz), benutzerdefinierte Genauigkeit. Bis zu 19 Ziffern.

Es ist eine reine Header-Lösung für C++.

7voto

Dan Hewett Punkte 2160

Kennen Sie IHR Angebot an Daten.

Ein Float hat nur eine Genauigkeit von 6 bis 7 Ziffern, d. h. maximal +-9999,99 ohne Rundung. Sie ist für die meisten Finanzanwendungen unbrauchbar.

Ein Doppelgänger ist also für 13 Ziffern gut: +-99,999,999,999,99. Seien Sie dennoch vorsichtig, wenn Sie große Zahlen verwenden. Beachten Sie, dass durch die Subtraktion zweier ähnlicher Ergebnisse ein Großteil der Genauigkeit verloren geht (siehe ein Buch über numerische Analyse für mögliche Probleme).

32-Bit-Ganzzahlen reichen bis +-2 Milliarden (bei der Skalierung auf Pfennige entfallen 2 Dezimalstellen)

64-Bit-Integer kann mit jedem Geld umgehen, aber auch hier ist Vorsicht geboten, wenn Sie konvertieren und mit verschiedenen Raten in Ihrer Anwendung multiplizieren, die Floats/Doubles sein könnten.

Das Wichtigste ist, dass Sie Ihren Problembereich verstehen. Welche rechtlichen Anforderungen haben Sie an die Genauigkeit? Wie werden Sie die Werte anzeigen? Wie oft wird die Konvertierung stattfinden? Brauchen Sie eine Internationalisierung? Vergewissern Sie sich, dass Sie diese Fragen beantworten können, bevor Sie Ihre Entscheidung treffen.

5voto

Jordan Parmer Punkte 34210

Für welchen Typ Sie sich auch immer entscheiden, ich würde empfehlen, ihn in einem "typedef" zu verpacken, damit Sie ihn zu einem anderen Zeitpunkt ändern können.

4voto

kmiklas Punkte 12075

Speichern Sie den Dollar- und Cent-Betrag als zwei getrennte Ganzzahlen.

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