¿Qué representa un doble en el servidor SQL?
Tengo un par de propiedades en C#
las que están double
y quiero almacenarlas en una tabla en SQL Server, pero noté que no hay ningún double
tipo, entonces, ¿qué es mejor usar decimal
o float
?
Esto almacenará los valores de latitud y longitud, por lo que necesito la precisión más precisa.
Gracias por las respuestas hasta el momento.
float
O si quieres ir a la vieja escuela:
real
También puedes usar float(53), pero significa lo mismo que float.
("real" es equivalente a float(24), no float/float(53).)
El tipo de SQL Server decimal(x,y) es para cuando desea números decimales exactos en lugar de punto flotante (que pueden ser aproximaciones). Esto contrasta con el tipo de datos "decimal" de C#, que se parece más a un número de punto flotante de 128 bits.
El tipo flotante de MSSQL es equivalente al tipo doble de 64 bits en .NET. (Mi respuesta original de 2011 decía que podría haber una ligera diferencia en la mantisa, pero lo probé en 2020 y parecen ser 100% compatibles en su representación binaria de números muy pequeños y muy grandes; consulte https:// /dotnetfiddle.net/wLX5Ox para mi prueba).
Para hacer las cosas más confusas, un "float" en C# es sólo de 32 bits, por lo que sería más equivalente en SQL al tipo real/float(24) en MSSQL que float/float(53).
En su caso de uso específico... Todo lo que necesita son 5 lugares después del punto decimal para representar la latitud y la longitud con una precisión de aproximadamente un metro, y solo necesita hasta tres dígitos antes del punto decimal para los grados. Float(24) o decimal(8,5) se adaptarán mejor a sus necesidades en MSSQL, y usar float en C# es suficiente, no necesita el doble. De hecho, sus usuarios probablemente le agradecerán que redondee a 5 decimales en lugar de tener un montón de dígitos insignificantes en el camino.
Además, aquí hay una buena respuesta para el mapeo de tipos SQL-CLR con un gráfico útil.
De esa publicación (por David ):
Debe asignarlo a FLOAT(53); eso es lo que hace LINQ to SQL .