Estou ciente de algumas boas opções :
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 .
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 ++
Cordas.
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).
- 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 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.
fonte
Respostas:
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.
fonte