2009-07-30 14 views
263

Tengo un par de propiedades en C# que son double y quiero almacenarlas en una tabla en SQL Server, pero me di cuenta de que no hay ningún tipo de double, entonces ¿qué es lo mejor para usar, decimal o float?¿Qué representa un servidor doble en sql?

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.

Respuesta

318
float 

O si quieres ir de la vieja escuela:

real 

Puede también utilizar flotador (53), pero significa lo mismo que el flotador.

("real" es equivalente a flotar (24), no flotan/flotador (53).)

El decimal (x, y) Tipo de SQL Server es para cuando se desea exacta decimal números 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 coma flotante de 128 bits.

MSSQL flotador no tiene exactamente la misma precisión que la de 64 bits doble tipo en .NET (ligera diferencia en la mantisa IIRC), pero es lo suficientemente cerca de un partido más 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 el caso de uso específico ... Todo lo que necesita es 5 lugares después del punto decimal para representar la latitud y longitud de precisión dentro de aproximadamente un metro, y sólo se necesitan 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 duplicar. De hecho, es probable que sus usuarios le agradezcan por redondear a 5 decimales en lugar de tener un montón de dígitos insignificantes para el viaje.

+1

Dice flotar, David dice decimal, ahora estoy aún más confundido :) – Xaisoft

+0

Estoy usando dobles en C# y estos valores serán valores de latitud y longitud en sus respectivas columnas. – Xaisoft

+1

Tengo que estar de acuerdo, y admitir que estaba fuera de la base. Me presentaron el decimal en el mundo de IBM DB2, donde el decimal es un tipo de datos real, compatible con todos los sabores de código y la base de datos en las plataformas de IBM. No es que no sea un tipo de datos real en el mundo de MS, pero no es compatible tan bien como en el campo de IBM. Perdón por crear confusión. – DaveN59

5

Para SQL Sever:

Tipo decimal es de 128 bits con signo número flotador es un número con signo de 64 bits.

La respuesta real es Flotante, No era correcto sobre el decimal.

La razón es que si usa un decimal nunca va a llenar 64 bits del tipo decimal.

Aunque decimal no le dará un error si intenta utilizar un tipo int.

Here es una buena tabla de referencia de los tipos.

+0

Ahora es aún más confuso con dos respuestas diferentes: p – Xaisoft

+0

No sea confuso. Esta respuesta es incorrecta Decimal es un tipo de base 10; Float (en SQL Server y CLR) es un tipo base-2. –

+0

No, mapas decimales a decimal –

7

float en SQL Server en realidad tiene [editar: casi] la precisión de un "doble" (en un sentido C#).

float es un sinónimo de float(53). 53 son los pedazos de la mantisa.

.NET double usa 54 bits para la mantisa.

+2

En realidad, IIRC, doble en .NET utiliza una mantisa de 52 bits y un exponente de 11 bits. – richardtallent

+0

Estaré maldito; ¡tienes razón! Me pregunto qué hace SQL con el bit extra; no se usa para el exponente. Si lo hiciera, el exponente subiría a + -616 en lugar de + -308. Tal vez para rastrear NULL? –

+0

Ahora estoy confundido. Cada evidencia apunta a la idea de que usan el mismo formato (como todo lo demás en Windows). ¿Y por qué no? No puedo encontrar una declaración definitiva sobre la representación bit a bit en SQL Server (además de la página de ayuda para float). Voy a publicar una corrección si me entero. –

5

Hay una great thread on MSDN que describe la diferencia principal entre flotador y decimales. En resumen, Float es aproximado y no puede representar algunos valores.

Mire la respuesta aceptada.

+1

El doble en C# también es aproximado, por el mismo motivo. Por lo tanto, flotar (o, el flotador más largo (53)) es la mejor combinación para el doble. – richardtallent

13

float es el equivalente más cercano.

SqlDbType Enumeration

Editar:

Para Lat/Long como se ha mencionado OP.

Un metro es 1/40,000,000 de la latitud, 1 segundo es alrededor de 30 metros. Float/double te da 15 cifras significativas. Con una aritmética mental rápida y poco fiable ... los errores de redondeo/aproximación serían aproximadamente la longitud de esta parada de llenado -> "."

+1

Vende tu tecnología de pantalla a Apple y ¡gana miles de millones! (La aritmética rápida me dice que tiene la resolución más extrema de la que haya oído hablar, incluso en latitudes cercanas al Polo Norte/Sur, aproximadamente mil millones de veces más alta que la mía). –

2

Parece que puede escoger y elegir. Si elige flotar, puede perder 11 dígitos de precisión. Si eso es aceptable, apúrate, aparentemente los diseñadores de Linq pensaron que esto sería 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 flotador de todos modos, sin traducción desordenada desde la base 10 a la base 2 y viceversa.

+0

Como otros señalaron, el doble también es impreciso. Mi voto es para flotar ... – DaveN59

+0

Esto es para almacenar valores de latitud y longitud. ¿Esto hace la diferencia? – Xaisoft

+0

Esto es simplemente incorrecto ... tanto flotante/flotante (53) en MSSQL y doble en C# tienen aproximadamente 15 dígitos de precisión. No son exactamente lo mismo, pero lo suficientemente cerca. Decimal, por otro lado, es una exageración completa para almacenar un doble, y tiene que volver a la base 2 para todos los cálculos en SQL Server, y volver a C# como un doble. – richardtallent

2

@Achilles ¡Excelente! Vine aquí por el doble se quedó para el TinyInt.

Aquí es un caso interruptor 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 editarlo para sus necesidades, pero el doble deben trabajar, que es la cuestión en mano.

20

Además, here es una buena respuesta para la asignación de tipos de SQL-CLR con un gráfico útil.

Desde ese puesto (por David): enter image description here

Cuestiones relacionadas