Perbedaan antara numerik, float, dan desimal dalam SQL Server

322

Apa perbedaan antara numeric, floatdan decimaltipe data dan yang harus digunakan dalam situasi apa?

Untuk segala jenis transaksi keuangan (misalnya untuk bidang gaji), mana yang lebih disukai dan mengapa?

priyanka.sarkar
sumber
1
Link desimal dan numerik di atas perlu diperbarui ke docs.microsoft.com/en-us/sql/t-sql/data-types/… . Tautan di atas tidak ada lagi.
Nigel Ainscoe
1
Biasanya, ketika berhadapan dengan subjek keuangan, menarik untuk bekerja dengan tipe Integer , selain yang Floating-point , dan menyimpan nilai sebagai sen , bukan dolar , misalnya.
Pedro

Jawaban:

494

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

  • numeric = decimal (5 hingga 17 bytes) ( Jenis Data Numerik yang Tepat )
    • akan memetakan ke Desimal di .NET
    • keduanya memiliki (18, 0) sebagai parameter default (presisi, skala) di SQL server
    • scale = jumlah maksimum angka desimal yang dapat disimpan di sebelah kanan titik desimal.
    • harap dicatat bahwa uang (8 byte) dan uang kecil (4 byte) juga tepat dan peta ke Desimal di .NET dan memiliki 4 titik desimal ( MSDN )
    • desimal dan numerik (Transact-SQL) - MSDN
  • real (4 byte) ( Perkiraan Tipe Data Numerik)
  • float (8 byte) ( Perkiraan Tipe Data Numerik)
    • akan memetakan ke Dobel dalam .NET
  • Semua tipe numerik yang tepat selalu menghasilkan hasil yang sama, terlepas dari jenis arsitektur prosesor yang digunakan atau besarnya angka
  • Parameter yang disediakan untuk tipe data float mendefinisikan jumlah bit yang digunakan untuk menyimpan mantissa dari angka floating point .
  • Tipe Data Numerik Perkiraan biasanya menggunakan lebih sedikit penyimpanan dan memiliki kecepatan yang lebih baik (hingga 20x) dan Anda juga harus mempertimbangkan ketika mereka dikonversi di .NET

Jenis Data Numerik yang Tepat Perkiraan Tipe Data Numerik

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

Iman
sumber
17
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?
BornToCode
7
nyata kurang akurat sehingga tidak disarankan kecuali menyimpan angka besar lebih besar yang desimal (> 10e38) diperlukan atau pertimbangan ruang. saya kira presisi di sini dalam kutipan berarti nilai yang mungkin dan besarnya bukan akurasi
Iman
12
@BornToCode "presisi" di sini mengacu pada seberapa luas nilai yang ingin Anda simpan. jika Anda perlu menyimpan nilai antara 1e10 dan 1e-10, maka decimalakan 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 decimalbidang 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.
Bacon Bits
Saya ketiga komentar BornToCode dan Iman. Saya baru saja bereksperimen (menggunakan SQL Server 2012), dan sepertinya epsilon mesin untuk float (53), tipe floating point berpresisi tertinggi, adalah 2.22044604925031E-16. Jadi Anda akan mendapatkan sekitar 15 angka penting dari itu. Di sisi lain, saya bisa mendapatkan 38 angka signifikan dari desimal.
Stewart
"Gunakan float..." - kata siapa? Apakah itu kutipan atau pendapat Anda?
user443854
24

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.

kmote
sumber
Jumlah desimal (tetap) ditentukan dalam Scalekolom.
Cees Timmerman
1
Jika Anda ingin 'tepat seperti yang ditentukan', dari sudut pandang standar, ada beberapa keuntungan numerickarena tidak akan pernah menyimpan dengan presisi lebih dari yang Anda minta: lihat stackoverflow.com/a/759606/626804
Ed Avis
13

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."

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

AK
sumber
2
Itu tidak masuk akal. Semua jawaban lain, dengan sumber, mengatakan bahwa tipe data numerik atau desimal akurat, dan tipe float atau nyata adalah perkiraan yang sangat dekat. Karena akurasi yang lebih rendah, saya dapat mengerti bahwa casting untuk float memungkinkan perhitungan lebih cepat, tetapi tidak presisi yang lebih tinggi.
cbaldan
3
Semua tipe data numerik dapat mengalami overflow dan underflow. Overflow adalah kesalahan eksplisit, namun, underflow tidak bersuara. Karakteristik underflow untuk decimaldan floatyang 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 .
ErikE
13

Mereka Berbeda dalam Presedensi Jenis Data

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:

Tautan referensi

Stephan
sumber
7

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.

Brian Reiter
sumber
Anda tidak menentukan yang mana yang lebih disukai saat kasusnya untuk transaksi keuangan dan mengapa?
priyanka.sarkar
Untuk SQL Server 2008 dan lebih tinggi, float (53) alias float adalah angka floating point presisi ganda (64-bit), sedangkan float (24) alias real adalah angka floating point presisi tunggal (32-bit). docs.microsoft.com/en-us/sql/t-sql/data-types/float-and-real-transact-sql
M Kloster
4

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.

Referensi 1 2 3

Somnath Muluk
sumber
3

Kasus untuk Desimal

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, DECIMALdi sebagian besar basis data.

Varus Septimus
sumber
1

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?

Simon Tewsi
sumber