Saya ingin tahu apakah ada perbedaan nyata antara money
tipe data dan sesuatu seperti decimal(19,4)
(yang menggunakan uang secara internal, saya percaya).
Saya sadar itu money
khusus untuk SQL Server. Saya ingin tahu apakah ada alasan kuat untuk memilih satu dari yang lain; kebanyakan sampel SQL Server (mis. database AdventureWorks) digunakan money
dan bukan decimal
untuk hal-hal seperti informasi harga.
Haruskah saya terus menggunakan datatype uang, atau adakah manfaat menggunakan desimal? Uang lebih sedikit untuk diketik, tetapi itu bukan alasan yang sah :)
sql-server
types
Wayne Molina
sumber
sumber
DECIMAL(19, 4)
adalah pilihan yang populer periksa ini juga periksa di sini Format Mata Uang Dunia untuk memutuskan berapa banyak tempat desimal yang digunakan, semoga membantu.Jawaban:
Jangan pernah Anda menggunakan uang. Itu tidak tepat, dan itu adalah sampah murni; selalu gunakan desimal / numerik.
Jalankan ini untuk melihat apa yang saya maksud:
Output: 2949.0000 2949.8525
Kepada sebagian orang yang mengatakan bahwa Anda tidak membagi uang dengan uang:
Ini adalah salah satu pertanyaan saya untuk menghitung korelasi, dan mengubahnya menjadi uang memberikan hasil yang salah.
sumber
money
berlebihanmoney
, 'ilustrasi' ini manipulatif. Ini adalah fakta yang terdokumentasi yangmoney
memiliki ketepatan tetap dan sangat terbatas. Dalam kasus seperti itu, yang pertama harus dikalikan, dan kemudian dibagi. Ubah urutan operator dalam contoh ini dan Anda akan mendapatkan hasil yang identik. Sebuahmoney
dasarnya adalah int 64-bit, dan jika Anda berurusan dengan int, Anda akan kalikan sebelum membaginya.SQLMenace mengatakan uang tidak tepat. Tetapi Anda tidak mengalikan / membagi uang dengan uang! Berapa 3 dolar kali 50 sen? 150 dolar? Anda mengalikan / membagi uang dengan skalar, yang seharusnya menjadi desimal.
Hasil dalam hasil yang benar:
money
bagus selama Anda tidak membutuhkan lebih dari 4 digit desimal, dan Anda memastikan skalar Anda - yang tidak mewakili uang - bernilaidecimal
s.sumber
money / money
? Jawabannya adalah seluruh unit tanpa tanda dolar terpasang, yang benar! Ini adalah skenario yang sangat masuk akal, menunjukkan bahwa karena kasus tepi aneh seperti ini,money
bukan tipe data yang baik untuk digunakan, karena hasilnya selalu terpotong kembali agar sesuaimoney
daripada mengikuti aturan normal untuk presisi dan skala. Bagaimana jika Anda ingin menghitung standar deviasi dari satu setmoney
nilai? Ya,Sqrt(Sum(money * money))
(disederhanakan) sebenarnya masuk akal.Semuanya berbahaya jika Anda tidak tahu apa yang Anda lakukan
Bahkan tipe desimal presisi tinggi tidak dapat menyelamatkan hari:
1,000000 <- Seharusnya 0,6000000
Itu
money
jenis adalah bilangan bulatRepresentasi teks dari
smallmoney
dandecimal(10,4)
mungkin mirip, tetapi itu tidak membuatnya dipertukarkan. Apakah Anda merasa ngeri ketika melihat tanggal disimpanvarchar(10)
? Ini adalah hal yang sama.Di belakang layar,
money
/smallmoney
hanyabigint
/int
Titik desimal dalam representasi teksmoney
adalah bulu visual, seperti tanda hubung pada tanggal tttt-hh-bb-hh. SQL sebenarnya tidak menyimpannya secara internal.Mengenai
decimal
vsmoney
, pilih apa pun yang sesuai dengan kebutuhan Anda. Themoney
jenis ada karena menyimpan nilai-nilai akuntansi sebagai kelipatan bilangan bulat dari 1/10000 unit sangat umum. Juga, jika Anda berurusan dengan uang aktual dan perhitungan di luar penjumlahan dan pengurangan sederhana, Anda seharusnya tidak melakukan itu di tingkat basis data! Lakukan di tingkat aplikasi dengan perpustakaan yang mendukung Pembulatan Bankir (IEEE 754)sumber
Saya menyadari bahwa WayneM telah menyatakan dia tahu bahwa uang itu khusus untuk SQL Server. Namun, ia bertanya apakah ada alasan untuk menggunakan uang lebih dari desimal atau sebaliknya dan saya pikir satu alasan yang jelas masih harus dinyatakan dan menggunakan desimal berarti satu hal yang tidak perlu dikhawatirkan jika Anda harus mengubah DBMS Anda - yang bisa terjadi.
Jadikan sistem Anda sefleksibel mungkin!
sumber
date
tipe, saya akan mengatakan Anda akan selalu memiliki masalah seperti itu. Anda harus mengatakan "Jangan menggunakan tipe yang sudah tidak digunakan lagi ketika database sudah menyediakan tipe yang lebih baik, lebih sesuai standar dan memperingatkan terhadap yang sudah usang".Ya saya suka
MONEY
! Ini satu byte lebih murah daripadaDECIMAL
, dan komputasi berkinerja lebih cepat karena (di bawah penutup) operasi penambahan dan pengurangan pada dasarnya operasi integer. Contoh @ SQLMenace — yang merupakan peringatan besar bagi yang tidak sadar — bisa juga diterapkan padaINT
egers, di mana hasilnya akan nol. Tapi itu bukan alasan untuk tidak menggunakan bilangan bulat— jika perlu .Jadi, sangat 'aman' dan tepat untuk digunakan
MONEY
ketika apa yang Anda hadapi adalahMONEY
dan menggunakannya sesuai dengan aturan matematika yang diikuti (sama sepertiINT
eger).Apakah lebih baik jika SQL Server mempromosikan pembagian dan perkalian dari
MONEY
menjadiDECIMAL
s (atauFLOAT
s?) - mungkin, tetapi mereka tidak memilih untuk melakukan ini; mereka juga tidak memilih untuk mempromosikanINT
egerFLOAT
ketika membaginya.MONEY
tidak memiliki masalah presisi; bahwaDECIMAL
dapat memiliki tipe perantara yang lebih besar yang digunakan selama perhitungan hanyalah 'fitur' dari penggunaan tipe itu (dan saya tidak benar-benar yakin seberapa jauh 'fitur' itu meluas).Untuk menjawab pertanyaan spesifik, "alasan kuat"? Nah, jika Anda ingin kinerja maksimum absolut di suatu
SUM(x)
tempatx
bisa jadiDECIMAL
atauMONEY
, makaMONEY
akan memiliki keunggulan.Juga, jangan lupa itu sepupu yang lebih kecil,
SMALLMONEY
—hanya 4 byte, tapi maks214,748.3647
— yang cukup kecil untuk uangnya — dan karenanya sering kali tidak cocok.Untuk membuktikan titik sekitar menggunakan tipe perantara yang lebih besar, jika Anda menetapkan perantara secara eksplisit ke variabel,
DECIMAL
menderita masalah yang sama:Menghasilkan
2950.0000
(oke, jadi setidaknyaDECIMAL
bulat daripadaMONEY
terpotong — sama seperti integer.)sumber
MONEY
adalah salah satu byte kurang dari yang besarDECIMAL
, dengan sampai 19 digit presisi. Namun, sebagian besar perhitungan moneter dunia nyata (hingga $ 9,99 M) dapat ditampung dalam aDECIMAL(9, 2)
, yang hanya membutuhkan lima byte. Anda dapat menghemat ukuran, lebih sedikit khawatir tentang kesalahan pembulatan, dan membuat kode Anda lebih portabel.Kami baru saja menemukan masalah yang sangat mirip dan saya sekarang sangat +1 untuk tidak pernah menggunakan Uang kecuali dalam presentasi tingkat atas. Kami memiliki beberapa tabel (efektifnya voucher penjualan dan faktur penjualan) yang masing-masing berisi satu atau lebih bidang Uang karena alasan historis, dan kami perlu melakukan perhitungan pro-rata untuk menentukan berapa banyak dari total faktur Pajak yang relevan untuk masing-masing baris pada voucher penjualan. Perhitungan kami adalah
Ini menghasilkan perhitungan uang dunia nyata / uang yang menyebabkan kesalahan skala pada bagian divisi, yang kemudian dikalikan menjadi proporsi tong yang salah. Ketika nilai-nilai ini selanjutnya ditambahkan, kita berakhir dengan jumlah proporsi tong yang tidak menambahkan hingga nilai total faktur. Jika salah satu dari nilai dalam tanda kurung adalah desimal (saya akan memberikan salah satu dari mereka) proporsi tong akan benar.
Ketika kurung tidak ada di sana ini awalnya bekerja, saya kira karena nilai-nilai yang lebih besar yang terlibat, secara efektif mensimulasikan skala yang lebih tinggi. Kami menambahkan tanda kurung karena melakukan perkalian terlebih dahulu, yang dalam beberapa kasus jarang meniup presisi yang tersedia untuk perhitungan, tetapi ini sekarang telah menyebabkan kesalahan yang jauh lebih umum ini.
sumber
Sebagai titik tandingan untuk dorongan umum dari jawaban lain. Lihat Banyak Manfaat Uang ... Jenis Data! dalam Panduan SQLCAT untuk Mesin Relasional
Secara khusus saya akan tunjukkan berikut ini
Jadi jawaban untuk pertanyaan itu adalah "itu tergantung". Anda harus lebih berhati-hati dengan operasi aritmatika tertentu untuk menjaga presisi tetapi Anda mungkin menemukan bahwa pertimbangan kinerja membuat ini bermanfaat.
sumber
Saya ingin memberikan pandangan yang berbeda tentang MONEY vs NUMERICAL, sebagian besar berdasarkan keahlian dan pengalaman saya sendiri ... Pandangan saya di sini adalah MONEY, karena saya telah bekerja dengannya untuk waktu yang cukup lama dan tidak pernah benar-benar menggunakan NUMERICAL .. .
MONEY Pro:
Tipe Data Asli . Ini menggunakan tipe data asli ( integer ) sama seperti register CPU (32 atau 64 bit), sehingga perhitungan tidak perlu overhead yang tidak perlu sehingga lebih kecil dan lebih cepat ... UANG membutuhkan 8 byte dan NUMERIK (19, 4 ) membutuhkan 9 byte (12,5% lebih besar) ...
UANG lebih cepat asalkan digunakan untuk itu dimaksudkan untuk menjadi (sebagai uang). Seberapa cepat?
SUM
Tes sederhana saya pada 1 juta data menunjukkan bahwa MONEY adalah 275 ms dan NUMERIC 517 ms ... Itu hampir dua kali lebih cepat ... Mengapa uji SUM? Lihat poin Pro berikutnyaCon MONEY:
money
tidak perlu begitu tepat dan dimaksudkan untuk digunakan sebagai uang, bukan hanya jumlah...Tapi ... Besar, tetapi di sini bahkan aplikasi Anda melibatkan uang sungguhan, tetapi jangan menggunakannya dalam banyak operasi SUM, seperti dalam akuntansi. Jika Anda menggunakan banyak divisi dan perkalian sebagai gantinya maka Anda seharusnya tidak menggunakan UANG ...
sumber
money
kolomSemua posting sebelumnya membawa poin yang valid, tetapi beberapa tidak menjawab pertanyaan dengan tepat.
Pertanyaannya adalah: Mengapa seseorang lebih suka uang ketika kita sudah tahu itu adalah tipe data yang kurang tepat dan dapat menyebabkan kesalahan jika digunakan dalam perhitungan yang rumit?
Anda menggunakan uang ketika Anda tidak akan membuat perhitungan yang rumit dan dapat memperdagangkan ketepatan ini untuk kebutuhan lain.
Misalnya, ketika Anda tidak harus membuat perhitungan tersebut, dan perlu mengimpor data dari string teks mata uang yang valid. Konversi otomatis ini hanya berfungsi dengan tipe data MONEY:
Saya tahu Anda dapat membuat rutin impor sendiri. Namun terkadang Anda tidak ingin membuat ulang rutin impor dengan format lokal khusus di seluruh dunia.
Contoh lain, ketika Anda tidak harus membuat perhitungan tersebut (Anda hanya perlu menyimpan nilai) dan perlu menyimpan 1 byte (uang membutuhkan 8 byte dan desimal (19,4) membutuhkan 9 byte). Dalam beberapa aplikasi (CPU cepat, RAM besar, IO lambat), seperti hanya membaca data dalam jumlah besar, ini juga bisa lebih cepat.
sumber
Anda tidak harus menggunakan uang ketika Anda perlu melakukan perkalian / pembagian nilai. Uang disimpan dengan cara yang sama dengan bilangan bulat disimpan, sedangkan desimal disimpan sebagai titik desimal dan digit desimal. Ini berarti bahwa uang akan menurunkan akurasi dalam kebanyakan kasus, sementara desimal hanya akan melakukannya ketika dikonversi kembali ke skala aslinya. Uang adalah titik tetap, sehingga skalanya tidak berubah selama perhitungan. Namun karena itu adalah titik tetap ketika dicetak sebagai string desimal (berlawanan dengan posisi tetap dalam string basis 2), nilai hingga skala 4 direpresentasikan secara tepat. Jadi untuk penambahan dan pengurangan, uang baik-baik saja.
Desimal diwakili dalam basis 10 secara internal, dan dengan demikian posisi titik desimal juga didasarkan pada angka dasar 10. Yang membuat bagian fraksinya mewakili nilainya dengan tepat, seperti halnya dengan uang. Perbedaannya adalah bahwa nilai tengah desimal dapat mempertahankan presisi hingga 38 digit.
Dengan angka floating point, nilainya disimpan dalam biner seolah-olah bilangan bulat, dan posisi titik desimal (atau biner, ahem) relatif terhadap bit yang mewakili angka tersebut. Karena ini adalah titik desimal biner, angka dasar 10 kehilangan presisi tepat setelah titik desimal. 1 / 5th, atau 0.2, tidak dapat direpresentasikan secara tepat dengan cara ini. Baik uang maupun desimal tidak mengalami keterbatasan ini.
Cukup mudah untuk mengkonversi uang menjadi desimal, melakukan perhitungan, dan kemudian menyimpan nilai yang dihasilkan kembali ke bidang uang atau variabel.
Dari POV saya, saya ingin hal-hal yang terjadi pada angka terjadi begitu saja tanpa harus terlalu memikirkannya. Jika semua perhitungan akan dikonversi menjadi desimal, maka bagi saya saya hanya ingin menggunakan desimal. Saya akan menyimpan bidang uang untuk keperluan tampilan.
Dari segi ukuran, saya tidak melihat cukup banyak perbedaan untuk mengubah pikiran saya. Uang membutuhkan 4 - 8 byte, sedangkan desimal dapat 5, 9, 13, dan 17. 9 byte dapat mencakup seluruh rentang yang dapat dicapai oleh 8 byte uang. Dari segi indeks (membandingkan dan mencari harus sebanding).
sumber
Saya menemukan alasan tentang menggunakan desimal atas uang dalam subjek akurasi.
DecimalResult> 1,000000
MoneyResult> 0,9999
FloatResult> 1
Cukup uji dan buat keputusan Anda.
sumber
Saya baru saja melihat entri blog ini: Uang vs. Desimal di SQL Server .
Yang pada dasarnya mengatakan bahwa uang memiliki masalah presisi ...
Untuk
money
jenisnya, Anda akan mendapatkan 19,30 bukannya 19,34. Saya tidak yakin apakah ada skenario aplikasi yang membagi uang menjadi 1000 bagian untuk perhitungan, tetapi contoh ini memang memaparkan beberapa batasan.sumber
money
dansmallmoney
akurat hingga seperseribu unit moneter yang mereka wakili.» seperti yang dikatakan di msdn.microsoft.com/en-us/library/ms179882.aspx sehingga siapa pun yang mengatakan "ini sampah" tidak tahu apa yang dia bicarakan.