Mir sind einige gute Optionen bekannt :
Große Ganzzahlen (z. B. int64_t, mpz_t, eine beliebige bignum lib ) für Cent oder 10 -n Cent - beispielsweise steht eine Ganzzahl für 1/100 eines Pennys (1,05 $ == 10500). Dies wird als skalierte Ganzzahl bezeichnet .
Hochrangige Bibliothek für Dezimalarithmetik mit beliebiger Genauigkeit wie BigDecimal in Java, Dezimal in Python, decimal.js in Javascript, boost :: multiprecision in C ++
Saiten.
Gepackte BCDs (binär codierte Dezimalstellen) sind eine esoterischere Methode, die in alter Software beliebt zu sein schien. Lesen Sie mehr darüber .
Welcher Datentyp wird im Produktionscode für Banken (oder Kreditkarten, Geldautomaten, POS-Systeme) tatsächlich am häufigsten verwendet? Ich frage besonders diejenigen, die für Banken gearbeitet haben.
BEARBEITEN: Super nützliche Links für diejenigen mit derselben Problemdomäne (die eine "Geld" -Datenstruktur implementieren müssen, die nicht kaputt geht).
- http://martinfowler.com/eaaDev/quantity.html
- http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR
- http://c2.com/cgi/wiki?MoneyObject
- http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency
- http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
EDIT für den Kollegen, der sagte, dies sei eine doppelte Frage : Dies ist eine praktische und keine theoretische Frage zu "Was ist das Beste?". Lesen Sie den unbearbeiteten Titel meiner Frage. Ich frage, was die Leute in den Codebasen der Banken aus erster Hand gesehen haben.
Ich weiß, dass BigDecimal offensichtlich "am besten" ist, aber solche netten APIs sind nicht überall verfügbar, ob Sie es glauben oder nicht, und Dezimalbibliotheken sind im Gegensatz zu Ints teuer.
quelle
Antworten:
Die meisten Banken sind immer noch auf Mainframes. Datentypen auf Mainframes sind nach heutigen Standards sehr ungeschickt. Dies können nur die als Zeichen codierten Ziffern sein. 1234.56 wäre also wirklich eine Zeichenfolge, die diese Ziffern enthält. Und ein Zeichen kann 4, 6 oder 9 Bit sein. In "optimierten" Situationen können zwei Ziffern in einem Zeichen enthalten sein. Immerhin benötigen Sie nur 4 Bits (ein Halbbyte) für ein Dezimalzeichen.
Sie würden sich fragen, wie um alles in der Welt sie jemals mit diesen Lösungen in Kontakt gekommen sind. Sie basieren häufig auf der Hardwarearchitektur. Wir sind an ein Vielfaches von 8-Bit-Architekturen gewöhnt. Früher war das nicht selbstverständlich.
Unisys verwendet 36-Bit-Wörter und Wörter können in 6-Bit-, 9-Bit-, 12-Bit- oder 18-Bit-Teile aufgeteilt werden, bevor sie zum Speichern von Daten verwendet werden.
Sei einfach froh, dass wir uns nicht mehr um dieses Zeug kümmern müssen. Das .NET Framework hat einen schönen Typ namens Dezimal, der für Währungen gut ist.
quelle