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
inten la unidad mínima de la moneda. - Formatear a
$1.234,50es 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
Tests como contratos vivos
Una buena suite de tests no es una red de seguridad que toleras — es la especificación ejecutable de lo que tu sistema promete, incluidas las propiedades que siempre deben cumplirse.
Haz que las decisiones sean reversibles
No puedes predecir de forma confiable la decisión correcta. Así que optimiza para errores baratos: prefiere decisiones que puedas deshacer sobre las que tienes que acertar a la primera.