Apa yang dimaksud dengan server sql ganda?

335

Saya memiliki beberapa properti C#yang ada doubledan saya ingin menyimpannya dalam tabel di SQL Server, tetapi saya perhatikan tidak ada doubletipe, jadi apa yang terbaik untuk digunakan, decimalatau float?

Ini akan menyimpan nilai garis lintang dan bujur, jadi saya membutuhkan ketepatan paling akurat.

Terima kasih atas tanggapannya sejauh ini.

Xaisoft
sumber
Berikut adalah pemetaan tipe data CLR ke SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles
Ada utas hebat tentang MSDN yang menjelaskan perbedaan utama antara FLOAT dan DECIMAL. Singkatnya, Float merupakan perkiraan dan tidak dapat mewakili beberapa nilai. Lihatlah jawaban yang diterima.
Matthew Jones

Jawaban:

387
float

Atau jika Anda ingin sekolah tua:

real

Anda juga dapat menggunakan float (53), tetapi artinya sama dengan float.

("nyata" sama dengan float (24), bukan float / float (53).)

The desimal (x, y) jenis SQL Server adalah ketika Anda ingin tepat angka desimal daripada titik (yang dapat perkiraan) mengambang. Ini berbeda dengan tipe data C # "desimal", yang lebih mirip dengan angka floating point 128-bit.

Tipe float MSSQL setara dengan tipe ganda 64-bit di .NET. (Jawaban asli saya dari 2011 mengatakan mungkin ada sedikit perbedaan dalam mantissa, tapi saya sudah menguji ini pada tahun 2020 dan mereka tampaknya 100% kompatibel dalam representasi biner mereka dari angka yang sangat kecil dan sangat besar - lihat https: / /dotnetfiddle.net/wLX5Ox untuk pengujian saya).

Untuk membuat hal-hal lebih membingungkan, "float" di C # hanya 32-bit, jadi itu akan lebih setara dalam SQL untuk tipe real / float (24) dalam MSSQL daripada float / float (53).

Dalam kasus penggunaan khusus Anda ... Yang Anda butuhkan adalah 5 tempat setelah titik desimal untuk mewakili lintang dan bujur dalam ketelitian sekitar satu meter, dan Anda hanya perlu hingga tiga digit sebelum titik desimal untuk derajat. Float (24) atau desimal (8,5) paling sesuai dengan kebutuhan Anda di MSSQL, dan menggunakan float di C # cukup baik, Anda tidak perlu dua kali lipat. Bahkan, pengguna Anda mungkin akan berterima kasih karena membulatkan ke 5 tempat desimal daripada memiliki banyak angka tidak signifikan yang ikut dalam perjalanan.

richardtallent
sumber
1
Anda mengatakan float, David mengatakan desimal, sekarang saya lebih bingung :)
Xaisoft
Saya menggunakan ganda di c # dan nilai-nilai ini akan menjadi nilai lintang dan bujur di kolom masing-masing.
Xaisoft
1
Saya harus setuju, dan mengakui saya salah pangkalan. Saya diperkenalkan dengan desimal di dunia IBM DB2, di mana desimal adalah tipe data nyata, didukung oleh semua rasa kode dan basis data pada platform IBM. Bukannya itu bukan tipe data nyata di dunia MS, tapi itu tidak didukung juga di kamp IBM. Maaf telah membuat kebingungan.
DaveN59
2
"MSSQL float tidak memiliki ketepatan yang sama persis dengan jenis ganda 64-bit di. NET (sedikit perbedaan dalam mantissa IIRC), tetapi ini merupakan kecocokan yang cukup dekat dengan sebagian besar penggunaan." Apakah Anda punya referensi untuk ini? Sejauh yang saya bisa lihat, keduanya menggunakan signifikansi 53 bit, gunakan 64 bit untuk penyimpanan, dan memiliki tata letak bit yang sama dan artinya sebagai IEEE 754.
codekaizen
2
Saya juga cukup ingin tahu tentang pertanyaan yang diajukan oleh @codekaizen (sedikit perbedaan dalam mantissa). Apakah Anda memiliki referensi atau tes yang mencontohkan ini?
Mads Ravn
62

Juga, inilah jawaban yang bagus untuk Pemetaan Tipe SQL-CLR dengan bagan yang bermanfaat.

Dari pos itu (oleh David ): masukkan deskripsi gambar di sini

Mazdak Shojaie
sumber
Tautan di bawah ini juga digunakan; ia memiliki informasi tambahan di atas karena menunjukkan prosedur dan enumerasi SqlDataReader (di samping perbandingan jenis .NET dan SQL) docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
d219
15

float adalah padanan terdekat.

Enumerasi SqlDbType

Untuk Lat / Long seperti yang disebutkan OP.

Satu meter adalah 1 / 40.000.000 dari garis lintang, 1 detik adalah sekitar 30 meter. Float / double memberi Anda 15 angka penting. Dengan beberapa aritmatika mental yang cepat dan cerdik ... kesalahan pembulatan / aproksimasi akan menjadi sekitar panjang dari penghentian isian ini -> "."

gbn
sumber
1
Jual teknologi layar Anda ke Apple dan hasilkan miliaran! (Aritmatika cepat memberi tahu saya bahwa Anda memiliki resolusi paling ekstrem yang pernah saya dengar, bahkan di lintang dekat dengan Kutub Utara / Selatan; sekitar satu miliar kali lebih tinggi daripada milik saya.)
Jonas Byström
10

Anda harus memetakannya ke FLOAT (53) - itulah yang dilakukan LINQ ke SQL .

RichardOD
sumber
8

float dalam SQL Server sebenarnya memiliki [hampir:] ketepatan dari "ganda" (dalam arti C #).

floatadalah sinonim untuk float(53). 53 adalah potongan mantissa.

.NET doublemenggunakan 54 bit untuk mantissa.

Euro Micelli
sumber
2
Sebenarnya, IIRC, dobel. NET menggunakan mantissa 52-bit dan eksponen 11-bit.
richardtallent
Saya akan sangat sial; kamu benar! Saya ingin tahu apa yang SQL lakukan dengan bit ekstra; itu tidak digunakan untuk eksponen. Jika ya, eksponen akan naik ke + -616 bukan + -308. Mungkin untuk melacak NULL?
Euro Micelli
Sekarang aku bingung. Setiap bukti menunjukkan gagasan bahwa mereka menggunakan format yang sama (seperti yang lainnya di Windows). Dan mengapa tidak? Saya tidak dapat menemukan pernyataan yang pasti tentang representasi bitwise di SQL Server (selain halaman bantuan untuk float). Saya akan mengirim koreksi jika saya tahu.
Euro Micelli
5

Untuk SQL Sever:

Jenis Desimal adalah angka bertanda 128 bit Float adalah nomor bertanda 64 bit.

Jawaban sebenarnya adalah Float , saya salah tentang desimal.

Alasannya adalah jika Anda menggunakan desimal Anda tidak akan pernah mengisi 64 bit dari jenis desimal.

Meskipun desimal tidak akan memberi Anda kesalahan jika Anda mencoba menggunakan tipe int.

Berikut adalah bagan referensi yang bagus untuk semua tipe.

David Basarab
sumber
Sekarang bahkan lebih membingungkan dengan dua jawaban berbeda: p
Xaisoft
1
Jangan bingung. Jawaban ini salah. Desimal adalah tipe basis-10; Float (dalam SQL Server dan CLR) adalah tipe basis-2.
Michael Petrotta
3

Sepertinya Anda bisa memilih. Jika Anda memilih float, Anda mungkin kehilangan presisi 11 digit. Jika itu dapat diterima, lakukan saja - tampaknya desainer Linq menganggap ini sebagai tradeoff yang baik.

Namun, jika aplikasi Anda membutuhkan digit tambahan itu, gunakan desimal. Desimal (diimplementasikan dengan benar) jauh lebih akurat daripada float - tidak ada terjemahan yang berantakan dari basis 10 ke basis 2 dan kembali.

DaveN59
sumber
Ini untuk menyimpan nilai garis lintang dan bujur. Apakah ini membuat sebuah perbedaan?
Xaisoft
Ini salah ... float / float (53) di MSSQL dan double di C # memiliki presisi sekitar 15 digit. Mereka tidak persis sama, tetapi cukup dekat. Desimal, di sisi lain, adalah kerja keras lengkap untuk menyimpan ganda, dan itu harus kembali ke basis 2 untuk semua perhitungan dalam SQL Server, dan kembali ke C # sebagai ganda.
richardtallent
Saya berdiri dikoreksi. Apa yang Anda katakan masuk akal bagi saya. Desimal hanya masuk akal jika Anda menyimpannya sebagai nilai desimal di mana-mana. Anda kehilangan nilai kapan pun Anda melakukan konversi dari basis 10 ke basis 2 (dan kembali).
DaveN59
-2

A Floatmewakili doubledalam SQL server. Anda dapat menemukan bukti dari pengkodean dalam C # di studio visual. Di sini saya telah menyatakan Overtimesebagai Floatdi SQL server dan di C #. Dengan demikian saya dapat mengkonversi

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

Di sini OverTimedinyatakanfloat type

Md Shoriful Islam
sumber