Tengo un par de propiedades en C#
que son double
y quiero almacenar estos en una tabla en SQL Server, pero di cuenta de que no hay double
tipo, por lo que es mejor para su uso, decimal
o float
?
Esto almacenará valores de latitud y longitud, por lo que necesito la precisión más precisa.
Gracias por las respuestas hasta el momento.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
fuente
fuente
Respuestas:
O si quieres ir a la vieja escuela:
También puede usar float (53), pero significa lo mismo que float.
("real" es equivalente a float (24), no float / float (53).)
El tipo decimal (x, y) de SQL Server es para cuando desea números decimales exactos en lugar de coma 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 coma 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 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 solo 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 es 5 lugares después del punto decimal para representar la latitud y la longitud dentro de 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 ajustará mejor a sus necesidades en MSSQL, y usar float en C # es lo suficientemente bueno, no necesita el doble. De hecho, tus usuarios probablemente te agradecerán por redondear a 5 decimales en lugar de tener un montón de dígitos insignificantes para el viaje.
fuente
Además, aquí hay una buena respuesta para la asignación de tipos SQL-CLR con un gráfico útil.
De ese post (por David ):
fuente
flotador es el equivalente más cercano.
Enumeración SqlDbType
Para Lat / Long como OP mencionado.
Un metro es 1 / 40,000,000 de la latitud, 1 segundo es alrededor de 30 metros. Flotar / doble te da 15 cifras significativas. Con algo de aritmética mental rápida y poco fiable ... los errores de redondeo / aproximación serían aproximadamente la longitud de esta parada de llenado -> "".
fuente
Debería asignarlo a FLOAT (53); eso es lo que hace LINQ to SQL .
fuente
float
en SQL Server tiene [editar: casi] la precisión de un "doble" (en sentido C #).float
es sinónimo defloat(53)
. 53 son los pedazos de la mantisa..NET
double
usa 54 bits para la mantisa.fuente
Para el servidor SQL:
El tipo decimal es un número con signo de 128 bits Float es un número con signo de 64 bits.
La respuesta real es Float , estaba equivocado sobre decimal.
La razón es que si usa un decimal, nunca llenará 64 bits del tipo decimal.
Aunque decimal no le dará un error si intenta usar un tipo int.
Aquí hay una buena tabla de referencia de los tipos.
fuente
Parece que puedes elegir y elegir. Si elige flotante, puede perder 11 dígitos de precisión. Si eso es aceptable, anímate, aparentemente los diseñadores de Linq pensaron que esto era una buena compensación.
Sin embargo, si su aplicación necesita esos dígitos adicionales, use decimal. Decimal (implementado correctamente) es mucho más preciso que un flotante de todos modos: no hay traducción desordenada de la base 10 a la base 2 y viceversa.
fuente
A
Float
representadouble
en el servidor SQL. Puede encontrar una prueba de la codificación en C # en Visual Studio. Aquí lo he declaradoOvertime
como unFloat
servidor SQL y en C #. Así puedo convertirAquí
OverTime
se declarafloat type
fuente