Arquitectura3 de junio de 20261 min

Por qué guardo el dinero como enteros

Hay un bug que aparece en casi toda app que maneja dinero antes de que alguien se detenga a pensarlo: 0.1 + 0.2 === 0.30000000000000004. El punto flotante nunca fue diseñado para representar dinero, y en cuanto empiezas a sumar, repartir y redondear montos, los errores se acumulan.

Por eso, en todo proyecto que toca dinero, tomo la misma decisión temprano: guardar los montos como enteros en la unidad más pequeña — centavos, o en pesos colombianos, simplemente pesos enteros.

La regla

  • El dominio nunca ve un float.
  • Un monto es un int en la unidad mínima de la moneda.
  • Formatear a $1.234,50 es asunto de los bordes (la UI), nunca del núcleo.

Por qué importa

Cuando el dinero es un entero, la igualdad es exacta. "¿Está saldado este plan?" se convierte en cada balance === 0 — sin epsilon, sin "casi". Esa única propiedad hace honesto al resto del sistema: la función de reparto puede garantizar que suma(partes) === total, y el algoritmo de saldado puede confiar en los números que recibe.

Es la misma idea de dominio en el centro, infraestructura en los bordes. La representación que mantiene la matemática correcta vive en el centro; el string bonito y consciente del locale es un detalle de la frontera.

Es una decisión diminuta. También es de las que duele revertir una vez que los balances están mal en producción — así que la tomo el día uno.

Notas relacionadas