Sepertinya Money
tipe tidak disarankan seperti yang dijelaskan di sini
Aplikasi saya perlu menyimpan mata uang, tipe data apa yang harus saya gunakan? Numerik, Uang, atau FLOAT?
sql
postgresql
database-design
pelamun
sumber
sumber
Jawaban:
Numerik dengan presisi 2 unit paksa. Jangan pernah menggunakan float atau float like datatype untuk mewakili mata uang karena jika Anda melakukannya, orang-orang akan tidak senang ketika angka garis bawah laporan keuangan salah dengan + atau - beberapa dolar.
Jenis uang hanya tersisa untuk alasan historis sejauh yang saya tahu.
sumber
scale - precision
numeric(3,2)
akan dapat menyimpan maks9.99
3-2 = 1
Sumber Anda sama sekali tidak resmi. Itu tanggal 2011 dan saya bahkan tidak mengenali penulis. Jika jenis uang secara resmi "berkecil hati" PostgreSQL akan mengatakannya di manual - yang tidak .
Untuk sumber yang lebih resmi , baca utas ini di pgsql-jenderal (mulai minggu ini saja!) , Dengan pernyataan dari pengembang inti termasuk D'Arcy JM Cain (penulis asli jenis uang) dan Tom Lane:
Jawaban terkait (dan komentar!) Tentang peningkatan dalam rilis terbaru:
Pada dasarnya,
money
penggunaannya sangat terbatas. The Postgres Wiki menyarankan untuk sebagian besar menghindarinya, kecuali untuk kasus-kasus yang didefinisikan secara sempit. Keuntungan lebihnumeric
adalah kinerja .decimal
hanyalah alias untuknumeric
di Postgres, dan banyak digunakan untuk data moneter, menjadi tipe "arbitrary precision". Manual :Secara pribadi, saya suka menyimpan mata uang sebagai
integer
mewakili Sen jika sen pecahan tidak pernah terjadi (pada dasarnya di mana uang masuk akal). Itu lebih efisien daripada opsi lain yang disebutkan.sumber
money
jenisnya sebenarnya sudah tidak digunakan lagi. Masalah telah diperbaiki dan jenisnya telah ditambahkan kembali di versi yang lebih baru. Secara pribadi saya suka menyimpan mata uang sebagaiinteger
mewakili Sen.Pilihan Anda adalah:
bigint
: menyimpan jumlah dalam sen. Inilah yang digunakan transaksi EFTPOS.decimal(12,2)
: menyimpan jumlah dengan tepat dua tempat desimal. Ini yang digunakan perangkat lunak buku besar paling umum.float
: ide yang mengerikan - akurasi tidak memadai. Inilah yang digunakan pengembang naif.Opsi 2 adalah yang paling umum dan paling mudah untuk digunakan. Jadikan presisi (12 dalam contoh saya, artinya 12 digit semuanya) besar atau kecil sebaik mungkin bagi Anda.
Perhatikan bahwa jika Anda menggabungkan beberapa transaksi yang merupakan hasil perhitungan (misalnya melibatkan nilai tukar) menjadi nilai tunggal yang memiliki makna bisnis, ketelitiannya harus lebih tinggi untuk memberikan nilai makro yang akurat; pertimbangkan untuk menggunakan sesuatu seperti
decimal(18, 8)
sehingga jumlahnya akurat dan nilai individual dapat dibulatkan menjadi presisi sen untuk tampilan.sumber
numeric(15,4)
ataunumeric(15,6)
itu ide yang bagus.Saya menyimpan semua bidang moneter saya sebagai:
numeric(15,6)
Tampaknya berlebihan untuk memiliki banyak tempat desimal, tetapi jika ada peluang sekecil apa pun Anda harus berurusan dengan banyak mata uang, Anda akan membutuhkan ketelitian yang tinggi untuk mengkonversi. Tidak peduli apa yang saya presentasikan kepada pengguna, saya selalu menyimpan ke US Dollar. Dengan cara itu saya dapat dengan mudah mengkonversi ke mata uang lain, mengingat tingkat konversi untuk hari yang terlibat.
Jika Anda tidak pernah melakukan apa pun kecuali satu mata uang, hal terburuk di sini adalah Anda menyia-nyiakan sedikit ruang untuk menyimpan beberapa angka nol.
sumber
Gunakan integer 64-bit yang disimpan sebagai
bigint
Saya sarankan menggunakan dolar mikro (atau mata uang utama serupa). Mikro berarti 1 juta jadi 1 mikro-dolar = $ 0,000001.
sumber
numeric(15,6)
disarankan dalam jawaban lain?bigint
. Ada developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… tetapi ia datang dengan dukungan terbatas (untuk saat ini) dan peringatan (mis. Anda tidak dapat melipatgandakannya dengan float dengan mudah saat melakukan konversi mata uang) . Mengingat bahwa maks Anda dapat menyimpan dalam integer JS menggunakan dolar mikro adalah $ 9 miliar yang mungkin masih bagus untuk kebanyakan kasus.Gunakan
BigInt
untuk menyimpan mata uang sebagai bilangan bulat positif yang mewakili nilai moneter dalam unit mata uang terkecil (misalnya, 100 sen untuk menyimpan $ 1,00 atau 100 untuk menyimpan ¥ 100 (yen Jepang, mata uang nol desimal). Inilah yang dilakukan Stripe - satu perusahaan jasa keuangan terpenting untuk e-commerce global.sumber