FLOAT y DOUBLE

FLOAT y DOUBLE almacenan números de punto flotante con precisión aproximada. Usan el estándar IEEE 754, que representa los números en formato binario con un exponente. Son más rápidos que DECIMAL para operaciones matemáticas y ocupan menos espacio, pero introducen pequeños errores de redondeo. Son apropiados para datos científicos, coordenadas, porcentajes y cualquier valor donde una diferencia en la décimo-sexta posición decimal es irrelevante.

Diferencias entre FLOAT y DOUBLE

TipoBytesPrecisiónDígitos exactos
FLOAT4Simple precisión~7 dígitos
DOUBLE8Doble precisión~15 dígitos

FLOAT usa 4 bytes y garantiza aproximadamente 7 dígitos significativos. DOUBLE (también llamado DOUBLE PRECISION o REAL) usa 8 bytes y garantiza unos 15 dígitos significativos.

Ejemplo básico

CREATE TABLE mediciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sensor VARCHAR(50),
    temperatura FLOAT,
    presion DOUBLE,
    humedad FLOAT
);
 
INSERT INTO mediciones (sensor, temperatura, presion, humedad) VALUES
('Sala A', 22.5, 1013.25, 45.3),
('Sala B', 23.1, 1012.80, 52.7),
('Exterior', 18.7, 1014.10, 68.2);
 
SELECT * FROM mediciones;
idsensortemperaturapresionhumedad
1Sala A22.51013.2545.3
2Sala B23.11012.852.7
3Exterior18.71014.168.2

Para lecturas de sensores, la precisión de FLOAT es más que suficiente. Los instrumentos de medición suelen tener una precisión mucho menor que 7 dígitos significativos.

El problema de la precisión

FLOAT y DOUBLE no representan todos los números decimales de forma exacta:

CREATE TABLE precision_test (
    valor_float FLOAT,
    valor_double DOUBLE,
    valor_decimal DECIMAL(20, 10)
);
 
INSERT INTO precision_test VALUES (0.1 + 0.2, 0.1 + 0.2, 0.1 + 0.2);
 
SELECT * FROM precision_test;
valor_floatvalor_doublevalor_decimal
0.300000011920928960.300000000000000040.3000000000

0.1 + 0.2 no es exactamente 0.3 en punto flotante. FLOAT tiene un error mayor que DOUBLE, y DECIMAL da el resultado exacto.

Comparaciones con punto flotante

Nunca compares valores de punto flotante con =:

SELECT 0.1 + 0.2 = 0.3;
0.1 + 0.2 = 0.3
0

El resultado es 0 (falso) porque los valores no son exactamente iguales. Para comparar valores de punto flotante, usa un margen de tolerancia:

SELECT ABS((0.1 + 0.2) - 0.3) < 0.000001 AS son_iguales;
son_iguales
1

O usa ROUND para comparar con un número fijo de decimales:

SELECT ROUND(0.1 + 0.2, 1) = ROUND(0.3, 1) AS son_iguales;

Cuándo usar FLOAT/DOUBLE

Datos científicos: mediciones de temperatura, presión, velocidad, aceleración. La precisión del instrumento ya limita la exactitud.

Coordenadas geográficas: latitud y longitud. FLOAT da una precisión de ~1 metro, DOUBLE da una precisión sub-milimétrica.

CREATE TABLE ubicaciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    latitud DOUBLE NOT NULL,
    longitud DOUBLE NOT NULL
);
 
INSERT INTO ubicaciones (nombre, latitud, longitud) VALUES
('Madrid', 40.416775, -3.703790),
('Barcelona', 41.385064, 2.173404),
('Sevilla', 37.389092, -5.984459);

Estadísticas y promedios: porcentajes, promedios, desviaciones estándar. El error inherente es irrelevante.

Gráficos y renderizado: posiciones en pantalla, rotaciones, escalas.

Cuándo NO usar FLOAT/DOUBLE

Dinero: siempre DECIMAL. Los errores de redondeo en dinero causan descuadres contables.

Contadores: siempre INT o BIGINT. Los contadores deben ser exactos.

Identificadores: nunca punto flotante. Los IDs deben compararse con = de forma fiable.

FLOAT con precisión

MySQL acepta FLOAT(p) donde p indica la precisión en bits:

-- FLOAT(p) con p de 0 a 23: se almacena como FLOAT (4 bytes)
-- FLOAT(p) con p de 24 a 53: se almacena como DOUBLE (8 bytes)
columna FLOAT(7)    -- FLOAT estándar
columna FLOAT(25)   -- Se convierte en DOUBLE

Esta sintaxis existe por compatibilidad con el estándar SQL. En la práctica, es mejor usar FLOAT o DOUBLE directamente.

Valores especiales

El punto flotante tiene valores especiales que el punto fijo no maneja:

SELECT
    1e308 AS numero_grande,
    1e-308 AS numero_pequeno;

DOUBLE puede representar valores desde ~5 × 10⁻³²⁴ hasta ~1.8 × 10³⁰⁸. FLOAT tiene un rango menor: desde ~1.2 × 10⁻³⁸ hasta ~3.4 × 10³⁸.

Operaciones de agregación

SELECT
    AVG(temperatura) AS temp_media,
    STDDEV(temperatura) AS desviacion,
    VARIANCE(temperatura) AS varianza
FROM mediciones;
temp_mediadesviacionvarianza
21.4333337148030601.89296944860009003.5833333333333330

Las funciones estadísticas como STDDEV y VARIANCE trabajan de forma natural con tipos de punto flotante.

Resumen: FLOAT vs DOUBLE vs DECIMAL

TipoBytesPrecisiónUso recomendado
FLOAT4~7 dígitosMediciones, sensores
DOUBLE8~15 dígitosCiencia, coordenadas
DECIMAL4-30ExactaDinero, finanzas

Usa DECIMAL cuando la exactitud importa (dinero). Usa DOUBLE cuando necesitas buen rango y precisión razonable (ciencia, coordenadas). Usa FLOAT cuando el espacio importa y la precisión es secundaria (sensores, gráficos).

Limpieza

DROP TABLE IF EXISTS mediciones;
DROP TABLE IF EXISTS precision_test;
DROP TABLE IF EXISTS ubicaciones;

En el siguiente artículo veremos BOOLEAN, el tipo lógico para valores verdadero/falso.

Escrito por Eduardo Lázaro