Sembra che il Money
tipo sia scoraggiato come descritto qui
La mia applicazione deve conservare la valuta, quale tipo di dati dovrei usare? Numerico, Denaro o FLOAT?
Sembra che il Money
tipo sia scoraggiato come descritto qui
La mia applicazione deve conservare la valuta, quale tipo di dati dovrei usare? Numerico, Denaro o FLOAT?
Risposte:
Numerico con precisione forzata di 2 unità. Non usare mai float o float come tipo di dati per rappresentare la valuta perché, in tal caso, le persone saranno infelici quando la cifra di fondo del rapporto finanziario non è corretta di + o - qualche dollaro.
Per quanto ne so, il tipo di denaro è rimasto solo per ragioni storiche.
scale - precision
numeric(3,2)
sarà in grado di memorizzare max9.99
3-2 = 1
La tua fonte non è in alcun modo ufficiale. Risale al 2011 e non riconosco nemmeno gli autori. Se il tipo di denaro fosse ufficialmente "scoraggiato", PostgreSQL lo direbbe nel manuale, cosa che non accade .
Per una fonte più ufficiale , leggi questa discussione in pgsql-general (solo da questa settimana!) , Con dichiarazioni di sviluppatori core tra cui D'Arcy JM Cain (autore originale del tipo di denaro) e Tom Lane:
Risposta correlata (e commenti!) Sui miglioramenti apportati alle versioni recenti:
Fondamentalmente, money
ha i suoi usi (molto limitati). Il Wiki di Postgres suggerisce di evitarlo ampiamente, ad eccezione di quei casi strettamente definiti. Il vantaggio numeric
è rappresentato dalle prestazioni .
decimal
è solo un alias per numeric
Postgres e ampiamente utilizzato per i dati monetari, essendo un tipo di "precisione arbitraria". Il manuale :
Il tipo
numeric
può memorizzare numeri con un numero molto elevato di cifre. È particolarmente raccomandato per la conservazione di importi monetari e altre quantità dove è richiesta la precisione.
Personalmente, mi piace conservare la valuta come integer
rappresentante centesimi se i centesimi frazionari non si verificano mai (fondamentalmente dove il denaro ha un senso). È più efficiente di qualsiasi altra delle opzioni menzionate.
money
tipo era, in effetti, obsoleto. I problemi sono stati risolti e il tipo è stato aggiunto nuovamente nelle versioni successive. Personalmente mi piace conservare la valuta come integer
rappresentante centesimi.
Le tue scelte sono:
bigint
: memorizza l'importo in centesimi. Questo è ciò che usano le transazioni EFTPOS.decimal(12,2)
: memorizza l'importo con esattamente due cifre decimali. Questo è ciò che utilizza il software di contabilità generale.float
: idea terribile - accuratezza inadeguata. Questo è ciò che usano gli sviluppatori ingenui.L'opzione 2 è la più comune e la più semplice con cui lavorare. Rendi la precisione (12 nel mio esempio, che significa 12 cifre in tutto) grande o piccola come funziona meglio per te.
Si noti che se si stanno aggregando più transazioni risultanti da un calcolo (ad es. Comportando un tasso di cambio) in un singolo valore con significato commerciale, la precisione dovrebbe essere maggiore per fornire un valore macro accurato; considerare l'utilizzo di qualcosa del genere in decimal(18, 8)
modo che la somma sia accurata e che i singoli valori possano essere arrotondati con precisione al centesimo per la visualizzazione.
numeric(15,4)
o numeric(15,6)
è una buona idea.
Tengo tutti i miei campi monetari come:
numeric(15,6)
Sembra eccessivo avere così tanti decimali, ma se c'è anche la minima possibilità che tu abbia a che fare con più valute avrai bisogno di molta precisione per la conversione. Indipendentemente da ciò che sto presentando a un utente, conservo sempre in dollari USA. In questo modo posso facilmente convertire in qualsiasi altra valuta, dato il tasso di conversione per il giorno in questione.
Se non fai mai altro che una valuta, la cosa peggiore qui è che hai perso un po 'di spazio per memorizzare alcuni zero.
bigint
Raccomando di usare micro-dollari (o simile valuta principale). Micro significa 1 milionesimo quindi 1 micro-dollaro = $ 0,000001.
numeric(15,6)
suggerito in un'altra risposta?
bigint
. C'è developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ma viene fornito con supporto limitato (per ora) e avvertenze (ad esempio non è possibile moltiplicarlo facilmente per un float durante la conversione di valuta) . Dato che il massimo che puoi memorizzare in un numero intero JS usando micro-dollari è $ 9 miliardi che probabilmente è ancora buono per la maggior parte dei casi.
Utilizzare BigInt
per memorizzare la valuta come numero intero positivo che rappresenta il valore monetario nell'unità di valuta più piccola (ad esempio, 100 centesimi per memorizzare $ 1,00 o 100 per memorizzare 100 ¥ (yen giapponese, una valuta decimale zero). Questo è ciò che fa Stripe - uno le più importanti società di servizi finanziari per l'e-commerce globale.