Was verwenden Banken eigentlich als Datentyp für Geld? [geschlossen]

9

Mir sind einige gute Optionen bekannt :

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

  2. Hochrangige Bibliothek für Dezimalarithmetik mit beliebiger Genauigkeit wie BigDecimal in Java, Dezimal in Python, decimal.js in Javascript, boost :: multiprecision in C ++

  3. Saiten.

  4. 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).

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.

Zelcon
quelle
4
Art der Bank, obwohl nicht speziell für eine Bank. Vor einigen Jahren habe ich an einem System gearbeitet, das sich mit Transaktionen und Zahlungen befasst, und wir haben Floatbugs umgangen, indem wir einen völlig neuen Datentyp eingeführt haben, eine Klasse, die nicht nur aus zwei 64-Bit-Ganzzahlen besteht, von denen eine die ganze Zahl und die andere den Dezimalteil darstellt.
Andy
1
David Packer, das ist eine großartige Idee. Ich denke, es könnte besser sein als die gemeinsame Implementierung, die aus zwei ganzen Zahlen besteht: einer großen Zahl und dem Exponenten (log_10 des Werts)
zelcon
1
Frage braucht eine 4. Option: BCD
Brendan
3
Zur Beantwortung der Frage im Titel ein COBOL S9 (13) V99 COMP-3. Passt in 8 8-Bit-Bytes.
Gilbert Le Blanc
2
Das Problem, das Sie hier haben, ist "welche Bank". Sie verwenden COBOL, Java, C / C ++, .NET usw. - es gibt keine Antwort, die zu dem passt, was Sie wissen möchten, da jeder dieser Typen unterschiedliche Typen verwendet. Sie könnten nach dem Sicherungsspeicher fragen, aber selbst dann werden je nach verwendeter Technologie Oracle-Dezimaltypen oder ein Mainframe-Typ verwendet.
Gbjbaanb

Antworten:

-2

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.

Martin Maat
quelle
1
@gnat: Dies ist ein Jahr alt und etwas eigennützig; Wie pflegen Banken Finanzdaten? Mainframes .
Gilbert Le Blanc
2
-1 für " Datentypen auf Mainframes sind nach heutigen Standards sehr ungeschickt. " Sie wissen offensichtlich nichts über Mainframes. IEEE-754-Floats, Dezimaldaten usw. gibt es zuhauf.
Ross Patterson
1
@ Ross IEEE 754 wurde 1985 gegründet. Viele Mainframe-Software ist viel älter. BCD und ähnliche Codierungen sind in aktiven Mainframe-Systemen immer noch sehr verbreitet. Und sie lassen sich nicht gut mit modernen Kodierungen vergleichen. Aber bitte geben Sie uns die richtige Antwort auf die Frage. Sie wissen offensichtlich viel über Mainframes. Obwohl Ihr Timing um ein paar Jahrzehnte verschoben zu sein scheint ... Erleuchten Sie uns.
Martin Maat
1
.NET hat einen netten Typ namens Decimal .., der sehr langsam und bei der Verarbeitung von Millionen von Transaktionen nicht gerade nützlich ist. Gott sei Dank haben wir Mainframes mit ihrer archaischen, aber schnellen Datenverarbeitung.
Gbjbaanb
1
@MartinMaat Gepackte Dezimalstellen waren für Währungswerte am häufigsten, als ich 1972 mit dem Programmieren begann. Es war ein Basisdatentyp in der IBM S / 360-Familie, und ich glaube, dass er zuvor Teil der kommerziellen Option der 1400-Serie war.
Ross Patterson