Qu'est-ce que les banques utilisent réellement comme type de données pour l'argent? [fermé]

9

Je connais quelques bonnes options :

  1. Grands entiers (par exemple, int64_t, mpz_t, toute lib bignum ) pour représenter des cents ou 10 -n cents - disons, un entier représente 1/100 de penny (1,05 $ == 10500). C'est ce qu'on appelle un entier mis à l'échelle .

  2. Bibliothèque de haut niveau pour l'arithmétique décimale de précision arbitraire telle que BigDecimal en Java, Decimal en Python, decimal.js en Javascript, boost :: multiprecision en C ++

  3. Cordes.

  4. Les BCD emballés (décimales codées binaires) sont une méthode plus ésotérique qui semblait populaire dans les anciens logiciels. En savoir plus au sujet il.

Dans le code de production pour les banques (ou cartes de crédit, distributeurs automatiques de billets, systèmes POS), quel type de données est le plus utilisé? Je demande surtout à ceux qui travaillaient pour les banques.

EDIT: Liens super utiles pour ceux ayant le même domaine problématique (ayant besoin d'implémenter une structure de données "monétaire" qui ne casse pas).

EDIT pour le boursier qui a dit qu'il s'agissait d'une question en double : il s'agit d'une question pratique et non théorique de "quel est le meilleur". Lisez le titre inédit de ma question. Je demande ce que les gens ont vu de première main dans les bases de code des banques.

Je sais que BigDecimal est "le meilleur" évidemment, mais de belles API comme celle-ci ne sont pas disponibles partout, croyez-le ou non, et les bibliothèques décimales sont chères par opposition aux ints.

zelcon
la source
4
Type de banque mais pas spécifiquement pour une banque. Il y a quelques années, j'ai travaillé sur un système traitant des transactions et des paiements et nous avons contourné les floatbugs en introduisant un tout nouveau type de données, une classe, comprenant non seulement mais deux entiers 64 bits, l'un représentant le nombre entier, l'autre la partie décimale.
Andy
1
David Packer, c'est une excellente idée. Je pense que cela pourrait être mieux que l'implémentation commune, qui est une structure de deux entiers: un grand nombre et l'exposant (la valeur log_10)
zelcon
1
La question nécessite une 4ème option: BCD
Brendan
3
Pour répondre à la question du titre, un COBOL S9 (13) V99 COMP-3. Convient à 8 octets de 8 bits.
Gilbert Le Blanc
2
Le problème que vous avez ici est «quelle banque». ils utilisent COBOL, Java, C / C ++, .NET, etc. - il n'y a pas de réponse qui corresponde à ce que vous voulez savoir car chacun d'eux utilise des types différents. Vous pouvez poser des questions sur le stockage de sauvegarde, mais même dans ce cas, les types décimaux Oracle ou un type de mainframe seraient utilisés en fonction de la technologie utilisée.
gbjbaanb

Réponses:

-2

La plupart des banques sont toujours sur des ordinateurs centraux. Les types de données sur les mainframes sont très maladroits par rapport aux normes actuelles. Il peut s'agir uniquement des chiffres codés en caractères. Donc, 1234.56 serait vraiment une chaîne contenant ces chiffres. Et un caractère peut avoir 4, 6 ou 9 bits. Ou, dans des situations "optimisées", il peut y avoir deux chiffres regroupés dans un seul caractère. Après tout, vous n'avez besoin que de 4 bits (un quartet) pour un caractère décimal.

Vous vous demandez comment diable ils ont pu opérer avec ces solutions. Ils sont souvent basés sur l'architecture matérielle. Nous sommes habitués aux multiples architectures 8 bits. Autrefois, ce n'était pas acquis.

Unisys utilise des mots de 36 bits et les mots peuvent être décomposés en parties de 6 bits, 9 bits, 12 bits ou 18 bits avant d'être utilisés pour stocker des données.

Soyez simplement heureux que nous n'ayons plus à nous occuper de ces choses. Le framework .NET a un joli type appelé décimal qui est bon pour les devises.

Martin Maat
la source
1
@gnat: Ceci est un an et quelque peu égoïste; Comment les banques gèrent-elles les données financières? Mainframes .
Gilbert Le Blanc
2
-1 pour " Les types de données sur les mainframes sont très maladroits par rapport aux normes d'aujourd'hui. " Vous ne savez évidemment rien sur les mainframes. Les flotteurs IEEE-754, les données décimales, etc. abondent.
Ross Patterson
1
@Ross IEEE 754 a été créé en 1985. Beaucoup de logiciels mainframe sont beaucoup plus anciens. Les codages BCD et similaires sont encore très courants dans les systèmes mainframe actifs. Et ils ne se comparent pas bien aux encodages modernes. Mais s'il vous plaît, donnez-nous la bonne réponse à la question. Vous en savez évidemment beaucoup sur les mainframes. Bien que votre timing semble être décalé de quelques décennies ... Éclairez-nous.
Martin Maat
1
.NET a un joli type appelé Decimal .. qui est vraiment lent et pas vraiment utile lors du traitement de millions de transactions. Dieu merci, nous avons des mainframes avec leur traitement de données archaïque mais rapide.
gbjbaanb
1
@MartinMaat Packed decimal était le plus courant pour les valeurs monétaires, lorsque j'ai commencé à programmer en 1972. C'était un type de données de base sur la famille IBM S / 360, et je pense qu'il faisait partie de l'option commerciale de la série 1400 avant cela.
Ross Patterson