EDICIÓN DIGITALEmpresas · Ahorro · Empleo
Empresas · Ahorro · Empleo
Buscar noticias

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.

Redacción · Actualidad Económica ·

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

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

Fuentes consultadas

Guía elaborada con apoyo de IA a partir de documentación oficial. Los ejemplos identificados como didácticos son propios. Transparencia editorial.