
Los tipos de datos flotantes (Float
) y reales (Real
) en SQL Server utilizan el formato de número de punto flotante. Real
es un número de punto flotante de precisión simple, mientras que Float
es un número de punto flotante de precisión doble. Los números de coma flotante pueden almacenar números muy grandes o muy pequeños. Pero esta a costa de la precisión. En este tutorial, se verán en detalle y aprenderás la diferencia entre los tipos de datos flotantes y decimales o numéricos.
¿Qué son los números de punto flotante?
Los números de punto flotante no tienen un punto decimal fijo. El punto decimal puede aparecer en cualquier parte del número, es decir, flota. Por lo tanto, se conoce como números de punto flotante. El comportamiento de float y real sigue el estándar IEEE para aritmética de punto flotante
Los números de punto flotante se almacenan utilizando la notación científica en formato binario. La notación científica es una forma de escribir números muy grandes o muy pequeños. Está escrito en el siguiente formato.
Significand x base exponencial! Notación cientifica |
---|
Por ejemplo, 650.000.000 se puede escribir en notación científica como 6,5 ? 10^8, donde 6,5 es Significando, 10 es la base y 8 es exponente.
Los números de coma flotante pueden ser de 8 bytes
(64 bits o precisión doble) o de 4 bytes
(32 bits o precisión simple).
Flotante y Real en SQL Server
El SQL Server tiene dos tipos de datos flotantes y reales que almacenan los números de punto flotante.
- El tipo de datos flotantes es un formato de precisión doble de 64
bits
. Utiliza 8bytes
de almacenamiento - El tipo de datos reales es un formato de precisión simple de 32
bits
. Utiliza 4bytes
de almacenamiento
La representación binaria de estos números es como se muestra a continuación.
Float: formato de precisión doble de 64 bits | ||
---|---|---|
0 Sign |
00000000000 Exponent |
0000000000 0000000000 0000000000 0000000000 0000000000 00 Mantissa (significand) |
Float: formato de precisión doble de 32 bits | ||
---|---|---|
0 Sign |
00000000 Exponent |
0000000000 0000000000 000 Mantissa (significand) |
El primer bit es un bit de signo que indica si el número es positivo o negativo. El 0 significa positivo. El exponente es de 11 bits (Float) o de 8 bits (Real). El significante usa los lugares restantes. 52 bits en caso de tipo de datos Float y 23 bits en caso de tipo de datos Real.
Creación de columnas Float y Real
La sintaxis para crear una columna flotante es float(n)
, n debe tener un valor entre 1 y 53. El valor predeterminado de n es 53.
Float(1) a Float(23) creará la columna de precisión única de 32 bits, que en realidad es un tipo de datos real. Por lo tanto, SQL Server lo asigna automáticamente al tipo de datos Real.
Float (24) a float (53) creará la columna de 64 bits de doble precisión, por lo tanto, se convierten simplemente en float.
create table testFloat
(
col10 float(10),
col20 float(20),
col23 float(23),
col24 float(24),
col25 float(25),
col30 float(30),
colF float,
colR real,
)
Número decimal vs punto flotante
El número decimal y el punto flotante pueden almacenar números decimales, por lo que es muy importante saber la diferencia entre ellos.
Decimal | Float |
---|---|
La posición del lugar decimal es fija. | La posición del lugar decimal no es fija |
La precisión máxima que puede manejar es de 38 dígitos (incluidos los puntos decimales) | Puede manejar una gran cantidad de datos |
Los resultados son más precisos en comparación con el flotador. | Las operaciones aritméticas pueden resultar en pérdida de precisión |
Los valores de datos decimales se almacenan exactamente como se especifica. | Utiliza el formato de 64 bits de doble precisión o el formato de 32 bits de precisión simple para almacenar datos. Esto da como resultado una aproximación del valor almacenado. |
Requiere más espacio de almacenamiento | Requiere menos espacio de almacenamiento |
Dado que el resultado es exacto, puede usarlos para realizar comprobaciones de igualdad (operadores = y <>), redondeo de números, etc. Siempre que el resultado se mantenga dentro del valor máximo y mínimo permitido. |
Evite el uso de controles de igualdad flotante (operadores = y <>), redondeo de números, etc. Además, evite usarlos en aplicaciones como aplicaciones financieras donde la precisión es importante. |
El punto flotante puede manejar una gran cantidad de datos
Por ejemplo, un tipo de datos decimal(9,2) usa 5 bytes de almacenamiento pero puede almacenar hasta -9999999.99 a 9999999.99.
Los tipos de datos Int usan 4 bytes y pueden almacenar números desde -2,147,483,648 hasta 2,147,483,647. Pero no podemos usarlo para almacenar fracciones.
Los datos de punto flotante (tipo de datos reales, formato de 32 bits de precisión única) pueden almacenar valores entre
-340, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000 y 340, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 0.0.
Pérdida de precisión
Un número de coma flotante puede tener un costo de precisión, para ver este tema sigue los siguientes pasos.
Primero crea una tabla con una columna flotante
create table testFloat
(
colFloat float,
)
Ahora inserta la suma de .1 + .2 en esa columna. Usamos la función CAST
para hacer que los números se conviertan a float
.
insert into testFloat (colFloat)
values ( CAST(.1 as FLOAT) + CAST( .2 as FLOAT))
Consulta y comprueba si el valor está insertado.
select * from testFloat
*Result
0.3
Ahora, recupera el número usando una condición where. La consulta no recuperará ningún registro.
select * from testFloat where colFloat= .3
select * from testFloat where colFloat= cast(.3 as float)
***Result
No Records
Esto se debe a que el .1 se almacena aproximadamente como 0.100 000 001 490 116 119 384 765 625 (en precisión simple de 32 bits). Puedes consultar el Convertidor
La pérdida de precisión también puede ocurrir en Decimal
. Pero sucede solo en caso de que el resultado final o el resultado intermedio exceda los límites para el tipo de datos decimal
.
Cuál usar
- Se prefiere el decimal si el número permanece por debajo de la precisión máxima proporcionada por el decimal, que es 38.
- Pero para manejar los números grandes, es posible que debas usar el valor real o float.
- Además, si el espacio de almacenamiento es el criterio principal, utiliza el tipo de datos real, que ocupa solo 4 bytes. Siempre que la precisión de la pérdida no afecte.
- Evita el uso de controles de igualdad flotante (=), controles de desigualdad (<>), etc., redondeo de números, etc. Además, evita usarlos en aplicaciones financieras donde la precisión es importante.