15

Quale classe dovrei usare per la rappresentazione del denaro per evitare la maggior parte degli errori di arrotondamento?Quale classe usare per la rappresentazione del denaro?

Devo utilizzare Decimal o un semplice number integrato?

Esiste una classe esistente Money con supporto per la conversione di valuta che potrei utilizzare?

Eventuali insidie ​​che dovrei evitare?

+0

Ho sempre pensato che la conversione di valuta fosse solo una moltiplicazione. – SilentGhost

+2

@SilentGhost: Sì e no. Devi tenere a mente * come * hai intenzione di usare i valori che hai. Come si fa quando hai pagato U $ S2000 + AR $ 6300 + € 1500 l'anno scorso e quest'anno hai pagato U $ S4000 + AR $ 1200 + € 500?Ci sono molte cose che devi prendere in considerazione, quindi un oggetto 'Money' dovrebbe salvare il valore storico * e * corrente. – voyager

+3

Insidie ​​da evitare: utilizzando numeri in virgola mobile. Vedi Office Space. –

risposta

6

Suppongo che tu stia parlando di Python. http://code.google.com/p/python-money/ "Primitives per lavorare con i soldi e le valute in Python" - il titolo si spiega da sé :)

+1

Ecco a cosa servono i tag :) – voyager

+0

Guardando http://code.google.com/p/python-money/source/browse/trunk/money/Money.py posso vedere che usano 'Decimal' per rappresentazione interna :) – voyager

4

Potresti essere interessato a QuantLib per lavorare con la finanza.

Ha classi integrate per la gestione di tipi di valuta e rivendica 4 anni di sviluppo attivo.

+0

Questo progetto sembra interessante, ma potrebbe essere un po 'eccessivo, molto probabilmente userò un progetto Python puro per semplicità. – voyager

3

Si potrebbe dare un'occhiata a questa libreria: python-money. Dal momento che non ho esperienza con esso, non posso commentare la sua utilità.

Un 'trucco' si potrebbe impiegare per gestire valuta come numeri interi:

  • Moltiplicare per 100/Divide da 100 (per esempio, $ 100,25 -> 10025) per avere una rappresentazione in 'centesimi
+5

Molti sistemi di contabilità tracciano le cose molto più precisamente rispetto al centesimo. –

+0

Vero, ma tutto dipende dai bisogni immagino ... La libreria quantlib a cui si fa riferimento in questo thread sembra un buon candidato per il lavoro finanziario "serio". – ChristopheD

8

Basta usare decimal.

+1

decimale non è adatto a causa del modo in cui gestisce la precisione. Supponiamo che tu gestisca importi inferiori a $ 10 miliardi con una precisione di $ 0,01, quindi indichi alla libreria decimale che i tuoi numeri non saranno più lunghi di 12 cifre. Ora hai due problemi: il tuo codice non può gestire l'iperinflazione; e $ 0,01 verrà visualizzato come '0,010000000000'. – Pitarou

9

Non utilizzare mai un numero in virgola mobile per rappresentare denaro. I numeri mobili non rappresentano i numeri in notazione decimale in modo accurato. Si finirebbe con un incubo di errori di arrotondamento composti e incapace di convertire in modo affidabile tra le valute. Vedi Martin Fowler's short essay on the subject.

Se si decide di scrivere la propria classe, è consigliabile basarla sul tipo di dati decimal.

Non penso che Python-money sia una buona opzione, perché non è stato mantenuto per un bel po 'di tempo e il suo codice sorgente ha un codice strano e inutile, e lo scambio di valute è semplicemente rotto.

Prova py-moneyed. È un miglioramento rispetto al denaro di Python.

0

Semplice, leggero, eppure idea estendibile:

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) 

È possibile:

  • implementare solo quello che ti serve nella vostra applicazione.
  • Estendilo man mano che cresci.
  • Modificare la rappresentazione interna e l'implementazione in base alle esigenze.