Soy consciente de algunas buenas opciones :
Grandes enteros (por ejemplo, int64_t, mpz_t, cualquier bignum lib ) para representar centavos o 10 -n centavos, por ejemplo, un entero representa 1/100 de un centavo ($ 1.05 == 10500). Esto se llama un entero escalado .
Biblioteca de alto nivel para aritmética decimal de precisión arbitraria como BigDecimal en Java, Decimal en Python, decimal.js en Javascript, boost :: multiprecision en C ++
Instrumentos de cuerda.
Los BCD empaquetados (decimales codificados en binario) es un método más esotérico que parecía popular en el software antiguo. Lee más sobre esto.
En el código de producción para bancos (o tarjetas de crédito, cajeros automáticos, sistemas POS), ¿qué tipo de datos se usa realmente más? Especialmente les pregunto a quienes trabajaban para los bancos.
EDITAR: enlaces súper útiles para aquellos con el mismo dominio problemático (que necesitan implementar una estructura de datos "monetaria" que no se rompa).
- 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
EDITAR para el compañero que dijo que esta es una pregunta duplicada : Esta es una pregunta práctica, no teórica, de "cuál es el mejor". Lea el título sin editar de mi pregunta. Me pregunto qué ha visto la gente de primera mano en las bases de códigos de los bancos.
Sé que BigDecimal es "el mejor" obviamente, pero buenas API como esa no están disponibles en todas partes, lo creas o no, y las bibliotecas decimales son caras en comparación con las entradas.
fuente
Respuestas:
La mayoría de los bancos todavía están en mainframes. Los tipos de datos en mainframes son muy torpes para los estándares actuales. Pueden ser solo los dígitos codificados como caracteres. Entonces 1234.56 realmente sería una cadena que contiene esos dígitos. Y un personaje puede ser de 4, 6 o 9 bits. O, en situaciones "optimizadas", podría haber dos dígitos empaquetados en un carácter. Después de todo, solo necesita 4 bits (un mordisco) para un carácter decimal.
Te preguntarás cómo alguna vez llegaron estas soluciones. A menudo se basan en la arquitectura de hardware. Estamos acostumbrados a múltiplos de arquitecturas de 8 bits. En los viejos tiempos esto no era un hecho.
Unisys usa palabras de 36 bits y las palabras se pueden dividir en partes de 6, 9, 12 o 18 bits antes de que se usen para almacenar datos.
Solo alégrate de que ya no tengamos que lidiar con esto. El marco .NET tiene un tipo agradable llamado decimal que es bueno para las monedas.
fuente