database-design currency

database design - ¿Cuáles son las desventajas de almacenar los valores monetarios en centavos/unidades menores?



database-design currency (3)

Me he dado cuenta de que algunas api de banda api financiera para el procesamiento de tarjetas de crédito requieren que los montos se transfieran como centavos, esto parece una buena simplificación y me hace preguntarme por qué no hago lo mismo en todas las aplicaciones. utilizando la base de datos NUMERIC de longitud ilimitada con Postgres y BigDecimal en mi código Java, pero me siento tentado por la simplicidad de almacenar dinero como centavos.

  1. ¿Cuáles son las desventajas de almacenar dinero como centavos?
  2. ¿Hay operaciones específicas que son difíciles de hacer con el dinero como centavos?
  3. ¿El dinero almacenado como centavos funciona con todas las monedas de todo el mundo o la contabilidad de diferentes monedas se convierte en un lío gigantesco de casos especiales?
  4. ¿Hay una buena biblioteca de java para trabajar con dinero como centavos?

ACTUALIZACIÓN Para las monedas que no tienen centavos, podemos generalizar la cuestión de almacenar dinero como la unidad menor más pequeña para una moneda, así que centavos por dólares y cualquiera que sea el equivalente para otras monedas.


  1. ¿Cuáles son las desventajas de almacenar dinero como centavos?

No son tantos. Almacenar dinero como centavos simplifica los cálculos y lo hace preciso. Como se mencionó varias veces, nunca represente su dinero como flotadores en los cálculos.

  1. ¿Hay operaciones específicas que son difíciles de hacer con el dinero como centavos?

Necesitarías eventualmente presentar la cantidad a los usuarios. Y los valores deben ser formateados de acuerdo con el formato para una moneda específica.

  1. ¿El dinero almacenado como centavos funciona con todas las monedas de todo el mundo o la contabilidad de diferentes monedas se convierte en un lío gigantesco de casos especiales?

Trabajar con monedas reales y admitir múltiples monedas en una aplicación puede requerir que almacene dinero en centésimas de centavos para admitir monedas como CLF con 4 decimales o BHD con 3 decimales. Ver ISO-4217 .

  1. ¿Hay una buena biblioteca de java para trabajar con dinero como centavos?

No que yo supiese. ¿Qué tipo de apoyo está buscando en dicha biblioteca?


El comercio generalmente se calcula en dólares (1 dólar australiano = 0.94 dólares estadounidenses al momento de la publicación). Es trivial decir que 100 centavos australianos = 94 centavos de dólar, sin embargo, hay muchas monedas donde los centavos no existen. La principal ventaja de los centavos es que puede almacenar valores como números enteros, mientras que los dólares deben almacenarse como valores decimales de punto fijo o flotante.

Una desventaja de almacenar valores monetarios en centavos (como enteros), es que pueden ocurrir errores de redondeo. Por ejemplo, 20 centavos australianos = 18.8 centavos estadounidenses.

Para las monedas que tienen centavos, es probable que a menudo sea fácil hacer cálculos, pero muchas veces tendrá que convertir a dólares (o moneda principal, para monedas que no sean en dólares), ya que es en lo que se basan los tipos de cambio. apagado.

Personalmente, siempre uso la moneda principal en una subdivisión, son más fáciles de manejar, menos propensos a errores de redondeo y más fáciles de leer ($ 150.50 es más fácil de leer que 15050 ¢).


El inconveniente es que no puedes representar unidades fraccionarias. Este es un problema si está realizando cálculos de intereses o similares. Sin embargo, si está realizando una transacción de "dinero real", este problema desaparece.

No importa si la moneda no es decimal, siempre que haya una unidad más pequeña, puede usarla para representar cualquier otra cantidad. Es posible que deba ser un poco más inteligente en la forma en que se muestra en un formato legible para las personas, si eso es relevante, pero ese es un problema aparte.

De hecho, es probable que el uso de la unidad más pequeña simplifique la realización de conversiones, ya que puede calcular la tasa de conversión entre la unidad más pequeña de cada par de divisas. Por supuesto, una vez que esté en las tasas de conversión, terminará necesitando usar BigDecimal (o similar) nuevamente.

Entonces, en resumen, puede ser mejor usar tanto la unidad más pequeña como su denominación, Y usar BigDecimal para manejar partes fraccionarias si pueden surgir. No use flotadores IEEE, ya que no pueden representar todos los números decimales correctamente. Esto conducirá a los tipos de errores que molestarán a alguien.