Apa perbedaan antara numeric
, float
dan decimal
tipe data dan yang harus digunakan dalam situasi apa?
Untuk segala jenis transaksi keuangan (misalnya untuk bidang gaji), mana yang lebih disukai dan mengapa?
Apa perbedaan antara numeric
, float
dan decimal
tipe data dan yang harus digunakan dalam situasi apa?
Untuk segala jenis transaksi keuangan (misalnya untuk bidang gaji), mana yang lebih disukai dan mengapa?
Jawaban:
gunakan float atau tipe data nyata hanya jika presisi yang diberikan oleh desimal (hingga 38 digit) tidak cukup
Tipe data numerik perkiraan tidak menyimpan nilai tepat yang ditentukan untuk banyak angka; mereka menyimpan perkiraan nilai yang sangat dekat . ( Technet )
Hindari menggunakan float atau kolom nyata dalam kondisi pencarian klausa WHERE, terutama operator = dan <> ( Technet )
jadi umumnya karena ketelitian yang diberikan oleh desimal adalah [10E38 ~ 38 digit] jika nomor Anda bisa muat di dalamnya, dan ruang penyimpanan yang lebih kecil (dan mungkin kecepatan) Float tidak penting dan berurusan dengan perilaku abnormal dan masalah perkiraan jenis numerik tidak dapat diterima, gunakan Desimal secara umum .
informasi yang lebih bermanfaat
sumber utama : MCTS Self-Paced Training Kit (Ujian 70-433): Pengembangan Basis Data Microsoft® SQL Server® 2008 - Bab 3 - Tabel, Jenis Data, dan Integritas Data Deklaratif Pelajaran 1 - Memilih Jenis Data (Pedoman) - Halaman 93
use the float or real data types only if the precision provided by decimal is insufficient
- Saya pikir nyata KURANG akurat kemudian desimal, jadi bagaimana mungkin Anda menulis untuk menggunakan nyata jika desimal tidak cukup?
decimal
akan baik-baik saja. Itu adalah ketepatan 20. Jika Anda perlu menyimpan nilai antara, katakanlah, 1e20 dan 1e-20, well, decimal
tidak bisa melakukan itu. Itu 40 digit presisi. Anda tidak dapat menyimpan 1e20 dan 1e-20 di decimal
bidang yang sama . Sebagai gantinya, Anda dapat menggunakan float
, yang secara internal menyimpan semuanya sebagai log basis 2. Itu memungkinkan rentang presisi penuh dalam satu bidang dengan kelemahan yang hanya akurat ~ 8 digit pertama.
float
..." - kata siapa? Apakah itu kutipan atau pendapat Anda?
Pedoman dari MSDN: Menggunakan desimal, float, dan Data nyata
Ketepatan maksimum default untuk tipe data numerik dan desimal adalah 38. Dalam Transact-SQL, numerik secara fungsional setara dengan tipe data desimal. Gunakan tipe data desimal untuk menyimpan angka dengan desimal ketika nilai data harus disimpan persis seperti yang ditentukan.
Perilaku float dan real mengikuti spesifikasi IEEE 754 tentang perkiraan tipe data numerik. Karena perkiraan sifat float dan tipe data nyata, jangan gunakan tipe data ini ketika perilaku numerik yang tepat diperlukan, seperti dalam aplikasi keuangan, dalam operasi yang melibatkan pembulatan, atau dalam pemeriksaan kesetaraan. Sebagai gantinya, gunakan tipe data integer, desimal, uang, atau uang kecil. Hindari penggunaan float atau kolom nyata dalam kondisi pencarian klausa WHERE, terutama operator = dan <>. Yang terbaik adalah membatasi kolom float dan real ke> atau <perbandingan.
Scale
kolom.
numeric
karena tidak akan pernah menyimpan dengan presisi lebih dari yang Anda minta: lihat stackoverflow.com/a/759606/626804
Bukan jawaban yang lengkap, tetapi tautan yang bermanfaat:
"Saya sering melakukan perhitungan terhadap nilai desimal. Dalam beberapa kasus memberikan nilai desimal ke float ASAP, sebelum perhitungan apa pun, menghasilkan akurasi yang lebih baik."
decimal
dan float
yang berbeda . Desimal mempertahankan terhadap underflow sebanyak mungkin dengan meningkatkan presisi atau skala. Namun, begitu Anda mencapai batas angka signifikan dalam desimal, arus bawah tidak bersuara (dan presisi hilang). Float memiliki jangkauan skala yang lebih luas, dan keterbatasan skalanya yang sebenarnya merupakan penyebab dari underflow. Dengan demikian, float dapat memiliki skala yang lebih baik. Meskipun demikian, ini masih merupakan tipe yang tidak eksak .
Desimal dan Numerik adalah fungsional yang sama tetapi masih ada prioritas tipe data , yang dapat menjadi penting dalam beberapa kasus.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
Tipe data yang dihasilkan adalah numerik karena mengambil prioritas tipe data .
Daftar lengkap tipe data dengan diutamakan:
Desimal memiliki presisi tetap sedangkan float memiliki presisi variabel.
EDIT (gagal membaca seluruh pertanyaan): Float (53) (alias nyata) adalah angka floating point presisi ganda (32-bit) dalam SQL Server. Float Reguler adalah angka floating point presisi tunggal. Double adalah kombinasi yang baik antara presisi dan kesederhanaan untuk banyak perhitungan. Anda dapat membuat angka presisi sangat tinggi dengan desimal - hingga 136-bit - tetapi Anda juga harus berhati-hati menentukan ketepatan dan skala dengan benar sehingga dapat memuat semua perhitungan menengah Anda ke jumlah digit yang diperlukan.
Float adalah tipe data angka-perkiraan, yang berarti bahwa tidak semua nilai dalam rentang tipe data dapat direpresentasikan secara tepat.
Desimal / Numerik adalah tipe data Presisi-Tetap, yang berarti bahwa semua nilai dalam rentang tipe data dapat direpresentasikan secara tepat dengan presisi dan skala. Anda dapat menggunakan desimal untuk menghemat uang.
Konversi dari Desimal atau Numerik ke mengapung dapat menyebabkan hilangnya presisi. Untuk tipe data Desimal atau Numerik, SQL Server menganggap setiap kombinasi presisi dan skala sebagai tipe data yang berbeda. DECIMAL (2,2) dan DECIMAL (2,4) adalah tipe data yang berbeda. Ini berarti 11.22 dan 11.2222 adalah tipe yang berbeda meskipun ini bukan kasus untuk float. Untuk FLOAT (6) 11.22 dan 11.2222 adalah tipe data yang sama.
Anda juga bisa menggunakan uang tipe data untuk menghemat uang. Ini adalah tipe data asli dengan ketepatan 4 digit untuk uang. Sebagian besar ahli lebih suka tipe data ini untuk menghemat uang.
Apa yang menjadi kebutuhan mendasarnya?
Itu muncul dari fakta bahwa, pada akhirnya, komputer mewakili, secara internal, angka dalam format biner. Itu mengarah, pasti, untuk kesalahan pembulatan.
Pertimbangkan ini:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
Ellipsis di atas [...] berarti 'tidak terbatas'. Jika Anda melihatnya dengan cermat, ada pola berulang berulang (= '0011')
Jadi, pada titik tertentu komputer harus membulatkan nilai itu. Hal ini menyebabkan kesalahan akumulasi yang berasal dari penggunaan berulang angka yang disimpan secara tidak tepat.
Katakan bahwa Anda ingin menyimpan jumlah finansial (yang merupakan angka yang mungkin memiliki bagian pecahan). Pertama-tama, Anda tidak dapat menggunakan bilangan bulat jelas (bilangan bulat tidak memiliki bagian fraksional). Dari sudut pandang matematika murni, kecenderungan alami adalah menggunakan afloat
. Tetapi, di komputer, pelampung memiliki bagian dari angka yang terletak setelah titik desimal - "mantissa" - terbatas. Itu mengarah pada kesalahan pembulatan.
Untuk mengatasinya, komputer menawarkan tipe data tertentu yang membatasi kesalahan pembulatan biner di komputer untuk angka desimal. Ini adalah tipe data yang benar-benar harus digunakan untuk mewakili jumlah keuangan. Tipe data ini biasanya pergi dengan nama Decimal
. Itu yang terjadi di C #, misalnya. Atau, DECIMAL
di sebagian besar basis data.
Meskipun pertanyaannya tidak termasuk tipe data MONEY, beberapa orang yang menemukan utas ini mungkin tergoda untuk menggunakan tipe data MONEY untuk perhitungan keuangan.
Berhati-hatilah dengan tipe data MONEY, ketepatannya terbatas.
Ada banyak informasi bagus tentang itu di jawaban pertanyaan Stackoverflow ini:
Haruskah Anda memilih tipe data UANG atau DECIMAL (x, y) di SQL Server?