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.

Advertisement

Etiquetas: ,

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s


Seguir

Get every new post delivered to your Inbox.