Finanzas personales · Guía documentada
Redondear un importe con Decimal exige elegir también la regla
La precisión decimal evita ciertas aproximaciones binarias, pero no decide la política del cálculo.
Una hoja de cálculo y un programa pueden discrepar en el último céntimo aunque ambos muestren dos decimales. En Python, Decimal permite representar cantidades decimales y quantize ajusta su exponente. La operación necesita una regla de redondeo; no basta pedir una presentación con dos posiciones.
La documentación distingue modos como ROUND_HALF_EVEN y ROUND_HALF_UP. En un empate exacto, el primero busca el último dígito par y el segundo se aleja de cero. Además, construir un Decimal desde una cadena conserva el decimal escrito; partir de un float puede incorporar su aproximación binaria.
Ejemplo didáctico propio: con la cadena 2.345 y una cuantización a 0.01, el empate produce 2.34 con HALF_EVEN y 2.35 con HALF_UP. Son resultados de reglas diferentes, no pruebas de que uno represente automáticamente la obligación fiscal de una factura.
Para revisar una discrepancia, registra el valor de entrada completo, la regla, el momento del redondeo y si se trabaja por línea o sobre el total. Redondear cada partida antes de sumar puede diferir de sumar cantidades sin redondear y ajustar al final.
El ejemplo explica aritmética de programación, no prescribe una regla contable o tributaria. Antes de automatizar un documento real, comprueba el criterio aplicable y conserva casos de prueba con resultado esperado. Cambiar únicamente el formato visible puede esconder la causa del céntimo distinto.
Reproduce el céntimo de diferencia
Ejemplo sintético propio ejecutado el 12 de noviembre de 2026 con Python 3.12.14. Solo utiliza la biblioteca estándar y no lee archivos, cuentas ni facturas. Puedes copiarlo en un archivo de práctica y ejecutarlo con Python.
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP
cent = Decimal('0.01')
value = Decimal('2.345')
print('HALF_EVEN:', value.quantize(cent, rounding=ROUND_HALF_EVEN))
print('HALF_UP:', value.quantize(cent, rounding=ROUND_HALF_UP))
lines = [value, value]
by_line = sum(x.quantize(cent, rounding=ROUND_HALF_UP) for x in lines)
by_total = sum(lines).quantize(cent, rounding=ROUND_HALF_UP)
print('Sumar lineas redondeadas:', by_line)
print('Redondear el total:', by_total)
Salida observada
HALF_EVEN: 2.34
HALF_UP: 2.35
Sumar lineas redondeadas: 4.70
Redondear el total: 4.69Las dos líneas parten de 2.345 cada una. Con HALF_UP, redondearlas antes de sumar da 4.70; sumar 2.345 + 2.345 y ajustar el total produce 4.69. El ejemplo mantiene la misma regla y cambia únicamente el momento del redondeo. Si lo reproduces, compara primero entrada, regla y secuencia, no solo el formato final.
La ejecución comprueba esta operación de programación. No determina qué criterio exige una factura, un contrato o una norma tributaria; ese requisito debe verificarse por separado.