Mam kilka właściwości, w C#
których są double
i chcę je przechowywać w tabeli w SQL Server, ale zauważyłem, że nie ma double
typu, więc co najlepiej użyć, decimal
czy float
?
Spowoduje to zapisanie wartości szerokości i długości geograficznej, więc potrzebuję najdokładniejszej precyzji.
Dzięki za dotychczasowe odpowiedzi.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
źródło
źródło
Odpowiedzi:
Lub jeśli chcesz iść do starej szkoły:
Możesz także użyć float (53), ale oznacza to to samo, co float.
(„real” jest równoważne z float (24), a nie float / float (53).)
Typ dziesiętny (x, y) SQL Server służy do tego, kiedy chcesz dokładnych liczb dziesiętnych zamiast liczb zmiennoprzecinkowych (które mogą być przybliżone). Jest to w przeciwieństwie do typu danych „dziesiętnych” w C #, który jest bardziej podobny do 128-bitowej liczby zmiennoprzecinkowej.
Typ zmiennoprzecinkowy MSSQL jest równoważny 64-bitowemu podwójnemu typowi w .NET. (Moja pierwotna odpowiedź z 2011 roku powiedziała, że może być niewielka różnica w mantysie, ale przetestowałem to w 2020 roku i wydają się być w 100% kompatybilne pod względem binarnej reprezentacji zarówno bardzo małych, jak i bardzo dużych liczb - patrz https: / /dotnetfiddle.net/wLX5Ox dla mojego testu).
Aby bardziej skomplikować sprawę, „liczba zmiennoprzecinkowa” w języku C # jest tylko 32-bitowa, więc byłaby bardziej równoważna w SQL z typem rzeczywistym / float (24) w MSSQL niż zmienna / zmiennoprzecinkowa (53).
W twoim konkretnym przypadku użycia ... Wszystko czego potrzebujesz to 5 miejsc po przecinku, aby przedstawić szerokość i długość geograficzną z dokładnością około jednego metra, a potrzebujesz tylko trzech cyfr przed przecinkiem dla stopni. Liczba zmiennoprzecinkowa (24) lub dziesiętna (8,5) najlepiej pasuje do twoich potrzeb w MSSQL, a użycie zmiennoprzecinkowe w C # jest wystarczająco dobre, nie potrzebujesz podwójnej. W rzeczywistości Twoi użytkownicy prawdopodobnie będą ci wdzięczni za zaokrąglenie do 5 miejsc po przecinku, zamiast zebrać kilka nieistotnych cyfr podczas jazdy.
źródło
Również tutaj jest dobra odpowiedź na mapowanie typów SQL-CLR z przydatnym wykresem.
Z tego postu (autorstwa Davida ):
źródło
float jest najbliższym odpowiednikiem.
Wyliczenie SqlDbType
Dla Lat / Long jak wspomniano OP.
Metr to 1/40 000 000 szerokości geograficznej, 1 sekunda to około 30 metrów. Float / double daje 15 znaczących liczb. W przypadku szybkiej i podejrzanej arytmetyki umysłowej ... błędy zaokrąglania / aproksymacji byłyby mniej więcej długości tego zatrzymania napełniania -> „”.
źródło
Powinieneś odwzorować go na FLOAT (53) - właśnie to robi LINQ na SQL .
źródło
float
w SQL Server faktycznie ma [edytuj: prawie] precyzję „podwójnej” (w sensie C #).float
jest synonimemfloat(53)
. 53 to kawałki mantysy..NET
double
używa 54 bitów dla mantysy.źródło
W przypadku serwera SQL Sever:
Typ dziesiętny to 128-bitowa liczba ze znakiem Liczba zmiennoprzecinkowa to 64-bitowa liczba ze znakiem.
Prawdziwa odpowiedź to Float , myliłem się co do dziesiętnych.
Powodem jest to, że jeśli użyjesz dziesiętnego, nigdy nie wypełnisz 64-bitowego typu dziesiętnego.
Chociaż liczba dziesiętna nie spowoduje błędu, jeśli spróbujesz użyć typu int.
Oto ładna tabela typów.
źródło
Wygląda na to, że możesz wybrać. Jeśli wybierzesz liczbę zmiennoprzecinkową, możesz stracić 11 cyfr precyzji. Jeśli jest to do zaakceptowania, wybierz to - najwyraźniej projektanci Linq uważali to za dobry kompromis.
Jeśli jednak aplikacja potrzebuje tych dodatkowych cyfr, użyj wartości dziesiętnych. Liczba dziesiętna (poprawnie zaimplementowana) jest znacznie dokładniejsza niż liczba zmiennoprzecinkowa - brak niechlujnego tłumaczenia z bazy 10 na bazę 2 i odwrotnie.
źródło
A
Float
reprezentujedouble
na serwerze SQL. Możesz znaleźć dowód z kodowania w C # w studio wizualnym. Tutaj zadeklarowałemOvertime
jakoFloat
w SQL Server i w C #. W ten sposób jestem w stanie nawrócićTutaj
OverTime
jest zadeklarowanefloat type
źródło