pyplot python currency rounding-error arbitrary-precision precision

python - pyplot - ¿Qué clase usar para la representación del dinero?



plot title python (6)

¿Qué clase debo usar para la representación del dinero para evitar la mayoría de los errores de redondeo?

¿Debo usar Decimal , o un simple número incorporado?

¿Existe alguna clase de Money con soporte para conversión de moneda que pueda usar?

¿Alguna trampa que deba evitar?


Idea simple, liviana, pero extensible:

class Money(): def __init__(self, value): # internally use Decimal or cents as long self._cents = long(0) # Now parse ''value'' as needed e.g. locale-specific user-entered string, cents, Money, etc. # Decimal helps in conversion def as_my_app_specific_protocol(self): # some application-specific representation def __str__(self): # user-friendly form, locale specific if needed # rich comparison and basic arithmetics def __lt__(self, other): return self._cents < Money(other)._cents def __add__(self, other): return Money(self._cents + Money(other)._cents)

Usted puede:

  • Implemente solo lo que necesite en su aplicación.
  • Extiéndelo a medida que crezcas.
  • Cambiar la representación interna y la implementación según sea necesario.

Nunca use un número de punto flotante para representar el dinero. Los números flotantes no representan números en notación decimal con precisión. Terminaría con una pesadilla de errores de redondeo compuestos y no podría convertir de manera confiable entre monedas. Ver el breve ensayo de Martin Fowler sobre el tema .

Si decide escribir su propia clase, le recomiendo basarla en el tipo de datos decimal .

No creo que Python-money sea una buena opción, ya que no se mantuvo durante bastante tiempo y su código fuente tiene un código extraño e inútil, y el intercambio de monedas simplemente está roto.

Pruebe py-moneyed . Es una mejora sobre el dinero de pitón.


Puede estar interesado en QuantLib para trabajar con finanzas.

Ha incorporado clases para el manejo de tipos de moneda y reclamos de 4 años de desarrollo activo.


Puedes echar un vistazo a esta biblioteca: http://code.google.com/p/python-money/ . Como no tengo experiencia con él, no puedo comentar sobre su utilidad.

Un ''truco'' que podrías emplear para manejar la moneda como enteros:

  • Multiplique por 100 / Divida por 100 (por ejemplo, $ 100,25 -> 10025) para tener una representación en ''centavos''

Sólo tiene que utilizar decimal .