c# - float - ¿Qué representa un doble en el servidor sql?
sql server data types (14)
¿No hay ya asignaciones en las clases System.Data.Sql?
Consulte: C #: tipos de datos de SQL Server equivalentes en .NET Framework .
Ahora, haz que el mío flote ...
Tengo un par de propiedades en C#
que son double
y quiero almacenarlas en una tabla en SQL Server, pero he notado que no hay double
tipo, así que, ¿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.
@Achilles Excelente! Vine aquí por el doble quedé por el TinyInt.
Aquí hay un caso de switch parcialmente hecho para convertir entre dataTable y SQL:
switch (columnDataTypeList[i])
{
case "System.String":
columnDataTypeList[i] = "VARCHAR(MAX)";
break;
case "System.Int32":
columnDataTypeList[i] = "INT";
break;
case "System.DateTime":
columnDataTypeList[i] = "DATE";
break;
case "System.Double":
columnDataTypeList[i] = "FLOAT";
break;
}
La cadena puede ser un problema, asegúrese de editarla según sus necesidades, pero el doble debería funcionar, lo cual es la pregunta en cuestión.
Además, here hay una buena respuesta para el mapeo de tipos SQL-CLR con un gráfico útil.
De ese post (por David ):
Aquí están las asignaciones de tipos de datos CLR a SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Como la mayoría de los otros han señalado, float
es la respuesta correcta. Consulte la documentación de Microsoft sobre SQL Server: asignación de tipos de datos CLR para obtener más información.
Debería asignarlo a FLOAT (53); eso es lo que hace LINQ to SQL .
El flotador es el equivalente más cercano.
Editar:
Para Lat / Long como OP mencionó.
Un metro es 1 / 40,000,000 de la latitud, 1 segundo es alrededor de 30 metros. Flotante / doble te da 15 cifras significativas. Con un poco de aritmética mental rápida y poco fiable ... los errores de redondeo / aproximación serían aproximadamente la longitud de esta parada de relleno -> "."
En caso de que sea útil, el siguiente es el enlace al que me refiero (¡esta vez terminé en este hilo en un primer Google!).
Tiene información adicional a los enlaces anteriores publicados, ya que muestra los procedimientos y las enumeraciones de SqlDataReader (además de las comparaciones de tipo .NET y SQL)
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings
(y si flotan!)
Hay un gran hilo en MSDN que describe la diferencia principal entre FLOAT y DECIMAL. En resumen, Float es aproximado y no puede representar algunos valores.
Mira la respuesta aceptada.
Para SQL Sever:
El tipo decimal es un número con signo de 128 bits. Flotante es un número con signo de 64 bits.
La respuesta real es Float , yo estaba equivocado con respecto al decimal.
La razón es que si usa un decimal nunca llenará 64 bits del tipo decimal.
Aunque decimal no te dará un error si intentas usar un tipo int.
Aquí hay una buena tabla de referencia de los tipos.
Parece que puedes escoger y elegir. Si elige flotar, puede perder 11 dígitos de precisión. Si eso es aceptable, adelante, al parecer, 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. El decimal (implementado correctamente) es mucho más preciso que un flotador de todos modos: no es una traducción desordenada de la base 10 a la base 2 y viceversa.
Float
representa el doble en el SQL server
. Puede encontrar una prueba de la codificación en C#
en el estudio visual. Aquí he declarado horas extras como Float
en el QL server
S QL server
y en C#
. Así soy capaz de convertir
int diff=4;
attendance.OverTime = Convert.ToDouble(diff);
Aquí OverTime se declara float type
float
en SQL Server en realidad tiene [editar: casi] la precisión de un "doble" (en un sentido de C #).
float
es un sinónimo de float(53)
. 53 son los bits de la mantisa.
.NET double
utiliza 54 bits para la mantisa.
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 flotar (24), no flotar / flotar (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 es más como un número de punto flotante de 128 bits.
MSSQL float no tiene exactamente la misma precisión que el tipo doble de 64 bits en .NET (ligera diferencia en la mantisa IIRC), pero es una coincidencia lo suficientemente cercana para la mayoría de los usos.
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 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 ajustará mejor a sus necesidades en MSSQL, y usar float en C # es suficiente, no necesita doble. De hecho, sus usuarios probablemente le agradecerán por redondear a 5 decimales en lugar de tener un montón de dígitos insignificantes para el viaje.