O que os bancos realmente usam como um tipo de dados para dinheiro? [fechadas]

9

Estou ciente de algumas boas opções :

  1. Inteiros grandes (por exemplo, int64_t, mpz_t, qualquer bignum lib ) para representar centavos ou 10- n centavos - digamos, um número inteiro representa 1/100 de um centavo (US $ 1,05 == 10500). Isso é chamado de número inteiro em escala .

  2. Biblioteca de alto nível para aritmética decimal de precisão arbitrária, como BigDecimal em Java, Decimal em Python, decimal.js em Javascript, boost :: multiprecision em C ++

  3. Cordas.

  4. BCDs compactados (decimais codificados binários) são um método mais esotérico que parecia popular em softwares antigos. Leia mais sobre isso.

No código de produção para bancos (ou cartões de crédito, caixas eletrônicos, sistemas POS), que tipo de dados é realmente mais usado? Estou especialmente perguntando a quem trabalhou em bancos.

EDIT: Links super úteis para aqueles com o mesmo domínio do problema (que precisam implementar uma estrutura de dados "monetária" que não se quebre).

EDIT para o sujeito que disse que esta é uma pergunta duplicada : Esta é uma questão prática, não teórica, de "qual é o melhor". Leia o título não editado da minha pergunta. Estou perguntando o que as pessoas viram em primeira mão nas bases de código dos bancos.

Eu sei que BigDecimal é "melhor", obviamente, mas APIs agradáveis ​​como essa não estão disponíveis em todos os lugares, acredite ou não, e as bibliotecas decimais são caras em oposição às ints.

zelcon
fonte
4
Tipo de banco relacionado, embora não especificamente para um banco. Alguns anos atrás, trabalhei em um sistema que lida com transações e pagamentos e contornamos erros de flutuação introduzindo um tipo de dados completamente novo, uma classe que consiste não apenas em dois inteiros de 64 bits, um representando o número inteiro e o outro na parte decimal.
Andy
11
David Packer, que é uma ótima idéia. Eu acho que poderia ser melhor do que a implementação comum, que é uma estrutura de dois inteiros: um número grande e o expoente (do valor log_10)
Zelcon
11
A pergunta precisa de uma quarta opção: BCD
Brendan
3
Para responder à pergunta no título, um COBOL S9 (13) V99 COMP-3. Cabe em 8 bytes de 8 bits.
Gilbert Le Blanc
2
O problema que você tem aqui é "qual banco". eles usam COBOL, Java, C / C ++, .NET etc. - não há resposta que atenda ao que você deseja saber, pois cada um deles usa tipos diferentes. Você pode perguntar sobre o armazenamento de backup, mas mesmo assim os tipos decimais Oracle ou um tipo de mainframe seriam usados ​​dependendo da tecnologia usada.
Gbjbaanb

Respostas:

-2

A maioria dos bancos ainda está em mainframes. Os tipos de dados nos mainframes são muito desajeitados para os padrões atuais. Eles podem ser apenas os dígitos codificados como caracteres. Portanto, 1234.56 seria realmente uma string contendo esses dígitos. E um personagem pode ter 4, 6 ou 9 bits. Ou, em situações "otimizadas", pode haver dois dígitos compactados em um caractere. Afinal, você só precisa de 4 bits (uma mordidela) para um caractere decimal.

Você se perguntaria como eles chegaram a essas soluções. Eles geralmente são baseados na arquitetura de hardware. Estamos acostumados a múltiplos de arquiteturas de 8 bits. Nos velhos tempos, isso não era dado.

A Unisys usa palavras de 36 bits e as palavras podem ser divididas em partes de 6, 9, 12 ou 18 bits antes de serem usadas para armazenar dados.

Apenas fique feliz por não precisarmos mais lidar com essas coisas. A estrutura do .NET tem um tipo agradável chamado decimal, que é bom para moedas.

Martin Maat
fonte
11
@gnat: Este é um ano de idade e um pouco egoísta; Como os bancos mantêm dados financeiros? Mainframes .
Gilbert Le Blanc
2
-1 para " Os tipos de dados nos mainframes são muito desajeitados para os padrões atuais " . Você obviamente não sabe nada sobre mainframes. Os flutuadores IEEE-754, dados decimais, etc. são abundantes.
Ross Patterson
11
O @Ross IEEE 754 foi criado em 1985. Muitos softwares de mainframe são muito mais antigos. BCD e codificações similares ainda são muito comuns em sistemas mainframe ativos. E eles não se comparam bem com as codificações modernas. Mas, por favor, dê-nos a resposta certa para a pergunta. Você obviamente sabe muito sobre mainframes. Embora seu tempo pareça estar atrasado há algumas décadas ... Esclareça-nos.
Martin Maat
11
O .NET tem um tipo agradável chamado Decimal .. que é realmente lento e não é exatamente útil ao processar milhões de transações. Graças a Deus, temos mainframes com seu processamento de dados arcaico, mas rápido.
Gbjbaanb
11
O @MartinMaat decimal embalado era mais comum para valores de moeda, quando comecei a programar em 1972. Era um tipo de dados base na família IBM S / 360, e acredito que fazia parte da opção comercial da série 1400 antes disso.
Ross Patterson