Moneda, decimales y redondeo en Python

A pesar de lo obvio que parece después, trabajar con el tipo Float, cuando uno quiere trabajar con moneda & contabilidad en Python, NO es lo mismo.

El módulo decimal, está diseñado específicamente para manejar números que requieran de una representación exacta, como se suele requerir en contabilidad. El tipo float no cumple ese cometido (leer la descripción para ver porqué).

Cuando entramos al modo “decimal”, no siempre Python maneja las conversiones de modo inteligente, por eso nos podemos topar con varias dificultades.

Una es el redondeo. La clase decimal tiene varios tipos de redondeos, pero con fines prácticos, para programas vinculados a contabilidad, modifiqué una rutina que encontré en otro blog. Como siempre lo pongo acá porque se que en algún momento lo voy a precisar.

def redondeo(cifra, digitos=0):
  """Rutina par redondeo de cifras decimales como para uso en contabilidad"""
  # Symmetric Arithmetic Rounding for decimal numbers
  if type(cifra) != decimal.Decimal:
    cifra = decimal.Decimal(str(cifra))
  return cifra.quantize(decimal.Decimal("1") / (decimal.Decimal('10') ** digitos), decimal.ROUND_HALF_UP)

Como siempre, es mejorable, pero da una idea del asunto.

Un comentario en “Moneda, decimales y redondeo en Python

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s