Saya memiliki beberapa properti C#
yang ada double
dan saya ingin menyimpannya dalam tabel di SQL Server, tetapi saya perhatikan tidak ada double
tipe, jadi apa yang terbaik untuk digunakan, decimal
atau float
?
Ini akan menyimpan nilai garis lintang dan bujur, jadi saya membutuhkan ketepatan paling akurat.
Terima kasih atas tanggapannya sejauh ini.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
sumber
sumber
Jawaban:
Atau jika Anda ingin sekolah tua:
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.
sumber
Juga, inilah jawaban yang bagus untuk Pemetaan Tipe SQL-CLR dengan bagan yang bermanfaat.
Dari pos itu (oleh David ):
sumber
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 -> "."
sumber
Anda harus memetakannya ke FLOAT (53) - itulah yang dilakukan LINQ ke SQL .
sumber
float
dalam SQL Server sebenarnya memiliki [hampir:] ketepatan dari "ganda" (dalam arti C #).float
adalah sinonim untukfloat(53)
. 53 adalah potongan mantissa..NET
double
menggunakan 54 bit untuk mantissa.sumber
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.
sumber
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.
sumber
A
Float
mewakilidouble
dalam SQL server. Anda dapat menemukan bukti dari pengkodean dalam C # di studio visual. Di sini saya telah menyatakanOvertime
sebagaiFloat
di SQL server dan di C #. Dengan demikian saya dapat mengkonversiDi sini
OverTime
dinyatakanfloat type
sumber