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?
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?
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.
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 lebih numeric
adalah kinerja .
decimal
hanyalah alias untuk numeric
di Postgres, dan banyak digunakan untuk data moneter, menjadi tipe "arbitrary precision". Manual :
Tipe ini
numeric
dapat menyimpan angka dengan jumlah digit yang sangat besar. Sangat disarankan untuk menyimpan jumlah moneter dan jumlah lainnya di mana ketelitian diperlukan.
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.
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 sebagai integer
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.
numeric(15,4)
atau numeric(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.
bigint
Saya sarankan menggunakan dolar mikro (atau mata uang utama serupa). Mikro berarti 1 juta jadi 1 mikro-dolar = $ 0,000001.
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.