Diferencia entre numérico, flotante y decimal en SQL Server


Busqué en Google y también visité decimal y numérico y SQL Server Helper para obtener la diferencia entre los tipos de datos numéricos, flotantes y decimales y también para averiguar cuál debe usarse en qué situación.

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

Author: dakab, 2009-06-29

6 answers

Utilice los tipos de datos float o real solo si la precisión proporcionada por decimal (hasta 38 dígitos) es insuficiente

  • Los tipos de datos numéricos aproximados no almacenan los valores exactos especificados para muchos números; almacenan una aproximación extremadamente cercana del valor.( Technet)

  • Evite el uso de columnas flotantes o reales en las condiciones de búsqueda de la cláusula WHERE, especialmente el = y operadores (Technet)

Por lo general, debido a que la precisión proporcionada por decimal es [10E38 ~ 38 dígitos] si su número puede caber en él, y el espacio de almacenamiento más pequeño (y tal vez la velocidad) de Flotación no es importante y tratar con comportamientos anormales y problemas de tipos numéricos aproximados no son aceptables, use Decimal generalmente.

Más información útil

  • numérico = decimal (5 a 17 bytes) (Exacto Datos numéricos Tipo)
    • se asignará al decimal en. NET
    • ambos tienen (18,0) como parámetros predeterminados (precisión, escala) en SQL server
    • escala = número máximo de dígitos decimales que se pueden almacenar a la derecha del punto decimal.
    • tenga en cuenta que money (8 byte) y smallmoney (4 byte) también son exactos y se asignan a Decimales En. NET y tienen 4 puntos decimales(MSDN)
    • decimal y numérico (Transact-SQL) - MSDN
  • real (4 bytes) ( Aproximado Tipo de Datos Numéricos)
  • flotador (8 bytes) (Aproximado Tipo de datos numéricos)
    • se asignará al Doble en. NET
  • Todos los tipos numéricos exactos siempre producen el mismo resultado, independientemente del tipo de la arquitectura del procesador se está utilizando o la magnitud de los números
  • El parámetro suministrado al tipo de datos float define el número de bits que son se utiliza para almacenar mantissa del número de coma flotante.
  • El Tipo de datos numéricos aproximados generalmente usa menos almacenamiento y tiene mejor velocidad (hasta 20x) y también debe considerar cuándo se convirtieron en. NET

Tipos de Datos Numéricos ExactosTipos De Datos Numéricos Aproximados

Fuente principal : MCTS Self-Paced Training Kit (Exam 70-433): Microsoft ® SQL Server ® 2008 Database Development - Chapter 3 - Tables , Data Types , and Declarative Data Integrity Lección 1 - Choosing Data Types (Guidelines) - Page 93

 373
Author: Iman Abidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:25

Pautas de MSDN: Usando datos decimales, flotantes y reales

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 decimal tipo de datos. Utilice el tipo de datos decimal para almacenar números con decimales cuando los valores de los datos deben almacenarse exactamente como se especifica.

El comportamiento de float y real sigue la Especificación IEEE 754 sobre 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 sean exactos se requiere un comportamiento numérico, como en aplicaciones financieras, en operaciones de redondeo o en controles de igualdad. En su lugar, utilice el tipos de datos integer, decimal, money o smallmoney. Evitar el uso de flotador o columnas reales en las condiciones de búsqueda de la cláusula WHERE, especialmente la = y operadores. Es mejor limitar las columnas flotantes y reales a > o

 18
Author: kmote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-07 15:01:05

No es una respuesta completa, sino un enlace útil:

"Con frecuencia hago cálculos contra valores decimales. En algunos casos, lanzar valores decimales para flotar LO antes posible, antes de realizar 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

 11
Author: A-K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-29 03:16:46

Difieren en la Precedencia del Tipo de Datos

Decimal y Numérico son los mismos funcionalmente pero todavía hay prioridad de tipo de datos, que puede ser importante 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 prioridad de tipo de datos.

Lista exhaustiva de tipos de datos por precedencia:

Enlace de Referencia

 9
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-03 14:37:36

El decimal tiene una precisión fija mientras que el float tiene una precisión variable.

EDITAR (no se pudo leer la pregunta completa): Float (53) (también conocido como real) es un número de punto flotante de doble precisión (32 bits) en SQL Server. El flotador regular es un número de punto flotante de una sola precisión. Double es una buena combinación de precisión y simplicidad para muchos cálculos. Puede crear un número de muy alta precisión con decimal up hasta 136 bits but pero también tiene que tener cuidado de definir su precisión y escala correctamente para que pueda contener todos tus cálculos intermedios al número necesario de dígitos.

 7
Author: Brian Reiter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-29 11:48:53

Float es un tipo de datos de número aproximado, lo que significa que no todos los valores en el rango de tipos de datos se pueden representar exactamente.

Decimal / Numérico es 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. Puede usar 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 el tipo de datos money para ahorrar dinero. Este es un tipo de datos nativo con una precisión de 4 dígitos para el dinero. La mayoría de los expertos prefieren este tipo de datos para guardar dinero.

Referencia 1 2 3

 1
Author: Somnath Muluk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-18 09:59:14