15

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

¿Debo usar Decimal, o un simple built-in number?

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

¿Alguna trampa que deba evitar?

+0

Siempre pensé que la conversión de divisas es solo una multiplicación. – SilentGhost

+2

@SilentGhost: Sí y no. Tienes que tener en cuenta * cómo * vas a usar los valores que tienes. ¿Cómo se siente cuando pagó U $ S2000 + AR $ 6300 + € 1500 el año pasado y este año pagó U $ S4000 + AR $ 1200 + € 500?Hay muchas cosas que debe tener en cuenta, por lo que un objeto 'Money' tendría que guardar el valor histórico * y * el valor actual. – voyager

+3

Peligro a evitar: usar números en coma flotante. Ver Espacio de oficina. –

Respuesta

6

Supongo que hablas de Python. http://code.google.com/p/python-money/ "Primitivas para trabajar con dinero y monedas en Python" - el título se explica por sí mismo :)

+1

Para eso están las etiquetas :) – voyager

+0

En http://code.google.com/p/python-money/source/browse/trunk/money/Money.py puedo ver que sí usan 'Decimal' para representación interna :) – voyager

4

Usted podría estar interesado en QuantLib para trabajar con las finanzas.

Tiene clases incorporadas para manejar tipos de moneda y afirma tener 4 años de desarrollo activo.

+0

Este proyecto parece interesante, pero puede ser demasiado, lo más probable es que utilice un proyecto de python puro para simplificar. – voyager

3

Puede echar un vistazo a esta biblioteca: python-money. Como no tengo experiencia, no puedo comentar sobre su utilidad.

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

  • Multiplicar por 100/Dividir por 100 (por ejemplo, $ 100,25 -> 10025) para tener una representación en 'granito de arena'
+5

Muchos sistemas de contabilidad rastrean las cosas mucho más precisamente que al centavo. –

+0

Cierto, pero todo depende de las necesidades, supongo ... La biblioteca quantlib a la que se hace referencia en este hilo parece ser un buen candidato para un trabajo financiero "serio". – ChristopheD

8

sólo tiene que utilizar decimal.

+1

decimal no es adecuado debido a la forma en que maneja la precisión. Supongamos que maneja cantidades de menos de $ 10 bn con una precisión de $ 0.01, por lo que le dice a la biblioteca decimal que sus números no tendrán más de 12 dígitos. Ahora tiene dos problemas: su código no puede manejar la hiperinflación; y $ 0.01 se mostrará como '0.010000000000'. – Pitarou

9

Nunca use un número de coma flotante para representar el dinero. Los números flotantes no representan números en notación decimal con precisión. Usted terminaría con una pesadilla de errores de redondeo compuesto, y no puede convertir de manera confiable entre monedas. Ver Martin Fowler's short essay on the subject.

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

No creo que el dinero python sea una buena opción, porque 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 se rompe.

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

0

simple, ligero, pero la idea 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) 

Puede:

  • Implementar sólo lo que necesita en su aplicación.
  • Extiéndalo a medida que crece.
  • Cambie la representación interna y la implementación según sea necesario.
Cuestiones relacionadas