2009-06-29 47 views
219

He buscado en Google y también he visitado decimal and numeric y SQL Server Helper para recoger la diferencia entre los tipos de datos numéricos, flotantes y decimales y también para averiguar cuál se debe usar en qué situación.Diferencia entre numérico, flotante y decimal en SQL Server

Para cualquier tipo de transacción financiera (por ejemplo, para el campo de salario), ¿cuál es el preferido y por qué?

+0

La relación numérica decimal y por encima de las necesidades de actualizar a https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and -numeric-transact-sql. El enlace de arriba ya no existe. –

+0

Normalmente, cuando se trata de temas financieros es interesante trabajar con tipos ** enteros **, además de los ** puntos flotantes **, y almacenar los valores como _cents_, en lugar de _dollars_, por ejemplo. – Pedro

Respuesta

335

uso del flotador o tipos de datos reales sólo si la precisión pr ovided por decimal (hasta 38 dígitos) es insuficiente

  • aproximado tipos de datos numéricos no almacenan los valores exactos especifican para muchos números; que almacenan una muy estrecha aproximación del valor. (Technet)

  • Evitar el uso de flotador o columnas reales en DONDE condiciones de búsqueda cláusula, especialmente los = y <> operadores (Technet)

por lo generalmente porque la precisión proporcionada por decimal es [10E38 ~ 38 dígitos] si su número puede caber en ella, y un espacio de almacenamiento más pequeño (y tal vez velocidad) de Float no es importante y se manejan comportamientos anormales y problemas de tipos numéricos aproximados. no es aceptable, use Decimal en general.

información más útil

  • numérico decimal = (5 a 17 bytes) (exacta Tipo de datos numérico)
    • se correlaciona con un decimal en.NET
    • Ambos tienen parámetros (18, 0) por defecto (precisión, escala) en el servidor SQL
    • scale = número máximo de dígitos decimales que se pueden almacenar a la derecha del punto decimal.
    • kindlynotethat dinero (8 bytes) y smallmoney (4 bytes) también son exactas y mapa para decimal en .NET y tienen 4 puntos decimales (MSDN)
    • decimal and numeric (Transact-SQL) - MSDN
  • real (4 bytes) (aproximado Tipo de datos numérico)
  • flotador (8 bytes) (aproximado Tipo de datos numérico)
    • se correlaciona con un doble en .NET
  • Todos exactas tipos numéricos siempre producen el mismo resultado , independientemente de qué tipo de arquitectura de procesador se esté usando o la magnitud de los números
  • El parámetro proporcionado para el tipo de datos flotante define la cantidad de bits que son utilizados para almacenar el mantissa del número de punto flotante.
  • aproximado numérica Tipo de datos por lo general utiliza menos espacio de almacenamiento y tienen una mayor velocidad (hasta 20 veces) y también se debe considerar cuando fueron convertidos en .NET

Exact Numeric Data Types Approximate Numeric Data Types

principal fuente: MCTS Self-Paced Training Kit (Exam 70-433): Microsoft® SQL Server® 2008 Database Development - Capítulo 3 - Tablas, tipos de datos, y la lección 1 declarativa integridad de datos - La elección de los tipos de datos (Directrices) - Página 93

+11

'use los tipos de datos flotantes o reales solo si la precisión proporcionada por el decimal es insuficiente' - Pensé que real es MENOS exacto que decimal, entonces ¿cómo puede escribir para usar real si el decimal es insuficiente? – BornToCode

+5

real es menos preciso, por lo que no es recomendable a menos que se almacenen números grandes más grandes que decimales (> 10e38) o consideraciones de espacio. Supongo que la precisión aquí en la cita significa valores posibles y magnitud no la precisión –

+5

@BornToCode La "precisión" aquí se refiere a qué tan amplios son los valores que desea almacenar. si necesita almacenar valores entre 1e10 y 1e-10, entonces 'decimal' estará bien. Esa es una precisión de 20. Si necesita almacenar valores entre, digamos, 1e20 y 1e-20, bueno, 'decimal' * no puede * hacer eso. Eso es 40 dígitos de precisión. Nunca puede almacenar 1e20 y 1e-20 en el mismo campo 'decimal'. En cambio, puede usar 'float', que internamente almacena todo como un log de base 2. Eso permite un rango completo de precisión en un campo con el inconveniente de que solo los primeros ~ 8 dígitos serán precisos. –

7

Decimal tiene una precisión fija, mientras que el flotador tiene una precisión variable.

EDITAR (no se pudo leer toda la pregunta): Float (53) (también conocido como real) es un número de punto flotante de doble precisión (32 bits) en SQL Server. Regular Float es un número de coma flotante de precisión simple. El doble es una buena combinación de precisión y simplicidad para muchos cálculos. Puede crear un número de alta precisión con decimal - hasta 136 bits - pero también debe tener cuidado de definir su precisión y escala correctamente para que pueda contener todos sus cálculos intermedios con la cantidad necesaria de dígitos.

+0

¿No especificó cuál es preferible mientras el caso va para la transacción financiera y por qué? –

11

No es una respuesta completa, pero un enlace útil: ". Con frecuencia hago cálculos en contra de los valores decimales En algunos casos fundición valores decimales a flote lo antes posible, antes de cualquier cálculo, produce una mayor precisión"

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

+1

Esto es realmente extraño. Pero funciona ... –

+1

No tiene sentido. Todas las otras respuestas, con fuentes, dicen que los tipos de datos numéricos o decimales son precisos, y los tipos float o real son una aproximación muy cercana. Debido a la menor precisión, puedo entender que la fundición flote puede permitir cálculos más rápidos, pero no una mayor precisión. – cbaldan

+1

Todos los tipos de datos numéricos pueden experimentar desbordamiento y subdesbordamiento. El desbordamiento es un error explícito; sin embargo, el subdesbordamiento es silencioso. Las características de underflow para 'decimal' y' float' son * different *. El decimal preserva contra el underflow tanto como sea posible aumentando la precisión o la escala. Sin embargo, una vez que alcanza el límite de dígitos significativos en decimales, los flujos inferiores se silencian (y se pierde precisión). Float tiene un rango más amplio de escala posible, y sus limitaciones de escala son la causa del subdesbordamiento. Por lo tanto, el flotador puede tener una mejor escala. No obstante, sigue siendo un tipo * inexacto *. – ErikE

18

Directrices de MSDN: Using decimal, float, and real Data

La precisión máxima predeterminada de los tipos de datos numéricos y decimales es 38. En Transact-SQL, numérico es funcionalmente equivalente al tipo de datos decimal . Utilice el tipo de datos decimales para almacenar números con decimales cuando los valores de datos se deben almacenar exactamente como se especifica.

El comportamiento de float y real sigue la especificación IEEE 754 en tipos de datos numéricos aproximados. Debido a la naturaleza aproximada de los tipos de datos flotantes y reales, no utilice estos tipos de datos cuando se requiera un comportamiento numérico exacto , como en aplicaciones financieras, en operaciones que implican redondeo o en controles de igualdad. En su lugar, use los tipos de datos enteros, decimales, dinero o smallmoney. Evite utilizar float o columnas reales en las condiciones de búsqueda de la cláusula WHERE, especialmente los operadores = y <>. Es mejor limitar las columnas float y real a> o < comparaciones.

+0

El número (fijo) de decimales se especifica en la columna 'Escala'. –

+0

Si quiere 'exactamente como se especifica', entonces, desde el punto de vista de los estándares, hay cierta ventaja en 'numérico' ya que nunca se almacenará con más precisión de la que pidió: vea http://stackoverflow.com/a/ 759606/626804 –

9

se diferencian en el tipo de datos de precedencia

decimal y numérico son los mismos funcionalmente pero todavía hay datos tipo de precedencia, que puede ser crucial en algunos casos.

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype') 

El tipo de datos resultante es numérico porque toma datos tipo precedencia.

Lista exhaustiva de tipos de datos por precedencia:

Reference link

1

Float es-Número aproximado tipo de datos, lo que significa que no todos los valores en el rango de tipo de datos se pueden representar con exactitud.

Decimal/Numérico es un tipo de datos de precisión fija, lo que significa que todos los valores en el rango de tipos de datos se pueden representar exactamente con precisión y escala. Puedes usar el decimal para ahorrar dinero.

Convertir de Decimal o Numérico a flotante puede causar cierta pérdida de precisión. Para los tipos de datos decimales o numéricos, SQL Server considera cada combinación específica de precisión y escala como un tipo de datos diferente. DECIMAL (2,2) y DECIMAL (2,4) son tipos de datos diferentes. Esto significa que 11.22 y 11.2222 son tipos diferentes aunque este no es el caso de float. Para FLOAT (6) 11.22 y 11.2222 son los mismos tipos de datos.

También puede usar dinero tipo de datos para ahorrar dinero. Este es un tipo de datos nativo con una precisión de 4 dígitos para dinero. La mayoría de los expertos prefiere este tipo de datos para ahorrar dinero.

Referencia 1 2 3

Cuestiones relacionadas