¿Qué utilizan realmente los bancos como tipo de datos para el dinero? [cerrado]

9

Soy consciente de algunas buenas opciones :

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

  2. 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 ++

  3. Instrumentos de cuerda.

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

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.

zelcon
fuente
44
Tipo de banco relacionado, aunque no específicamente para un banco. Hace unos años trabajé en un sistema que se ocupaba de transacciones y pagos y eludimos los errores de flotación introduciendo un tipo de datos completamente nuevo, una clase, que consta no solo de dos enteros de 64 bits, uno que representa el número entero y el otro la parte decimal.
Andy
1
David Packer es una gran idea. Creo que podría ser mejor que la implementación común, que es una estructura de dos enteros: un número grande y el exponente (el valor log_10)
zelcon
1
La pregunta necesita una cuarta opción: BCD
Brendan
3
Para responder la pregunta en el título, un COBOL S9 (13) V99 COMP-3. Se adapta a 8 bytes de 8 bits.
Gilbert Le Blanc
2
El problema que tienes aquí es "qué banco". usan COBOL, Java, C / C ++, .NET, etc., no hay respuesta que se ajuste a lo que desea saber, ya que cada uno de ellos usa diferentes tipos. Puede preguntar sobre el almacenamiento de respaldo, pero incluso entonces se utilizarán los tipos decimales de Oracle, o un tipo de mainframe, dependiendo de la tecnología utilizada.
gbjbaanb

Respuestas:

-2

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.

Martin Maat
fuente
1
@gnat: Este es un año de antigüedad y algo egoísta; ¿Cómo mantienen los bancos los datos financieros? Mainframes .
Gilbert Le Blanc
2
-1 para " Los tipos de datos en mainframes son muy torpes para los estándares actuales " . Obviamente no sabes nada sobre mainframes. IEEE-754 flotantes, datos decimales, etc. abundan.
Ross Patterson
1
@Ross IEEE 754 se estableció en 1985. Una gran cantidad de software de mainframe es mucho más antiguo. BCD y codificaciones similares siguen siendo muy comunes en sistemas mainframe activos. Y no se comparan bien con las codificaciones modernas. Pero por favor, denos la respuesta correcta a la pregunta. Obviamente sabes mucho sobre mainframes. Aunque tu tiempo parece estar retrasado por un par de décadas ... Ilumínanos.
Martin Maat
1
.NET tiene un tipo agradable llamado Decimal ... que es realmente lento y no exactamente útil cuando se procesan millones de transacciones. Gracias a Dios tenemos mainframes con su procesamiento de datos arcaico, pero rápido.
gbjbaanb
1
@MartinMaat El decimal empaquetado era más común para los valores de moneda, cuando comencé a programar en 1972. Era un tipo de datos base en la familia IBM S / 360, y creo que era parte de la opción comercial de la serie 1400 antes de eso.
Ross Patterson