MySQL: ¿Cuál es la diferencia entre float y double?


110

Al verificar la nueva estructura de la base de datos, vi que alguien cambió un campo de flotante a doble. Preguntándome por qué, revisé la documentación de mysql, pero honestamente no entendí cuál es la diferencia.

¿Alguien puede explicarlo?



1
Supongo que te refieres a este enlace: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
arun


También es relevante: Punto # 5 en dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html
rinogo

Respuestas:


106

Ambos representan números de coma flotante. A FLOATes para DOUBLEnúmeros de precisión simple, mientras que a es para números de precisión doble.

MySQL usa cuatro bytes para valores de precisión simple y ocho bytes para valores de precisión doble.

Existe una gran diferencia entre los números de coma flotante y los números decimales (numéricos), que puede utilizar con el DECIMALtipo de datos. Esto se usa para almacenar valores de datos numéricos exactos, a diferencia de los números de coma flotante, donde es importante preservar la precisión exacta, por ejemplo, con datos monetarios.


27
¿Puedes explicarlo con un ejemplo?
Kailas

4
@Kailas Los flotadores se redondean y los decimales no. El decimal (9,3) podría ser, por ejemplo, 123456.789, mientras que si intentara almacenar 123456.789, se insertaría como 123456.0 como flotante.
Blake

76

Quizás este ejemplo podría explicarlo.

CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2)); 

Tenemos una mesa como esta:

+-------+-------------+
| Field | Type        |
+-------+-------------+
| fla   | float       |
| flb   | float       |
| dba   | double(10,2)|
| dbb   | double(10,2)|
+-------+-------------+

Para la primera diferencia, intentamos insertar un registro con '1.2' en cada campo:

INSERT INTO `test` values (1.2,1.2,1.2,1.2);

La tabla que se muestra así:

SELECT * FROM `test`;

+------+------+------+------+
| fla  | flb  | dba  | dbb  |
+------+------+------+------+
|  1.2 |  1.2 | 1.20 | 1.20 |
+------+------+------+------+

¿Ver la diferencia?

Intentamos con el siguiente ejemplo:

SELECT fla+flb, dba+dbb FROM `test`;

¡Hola! Podemos encontrar la diferencia así:

+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+

1
Tal vez una mejor comparación hubiera sido dar fla y flb 2 puntos decimales también. float(10, 2)
Agradecido

30

Los dobles son como flotadores, excepto por el hecho de que son dos veces más grandes. Esto permite una mayor precisión.


Tenga en cuenta que flota y dobla ronda después de cierto punto. Por ejemplo, 100000.1 se trunca a 100000 como flotante.
Blake

14

Que me gustaría añadir mi propio ejemplo, que me ayudó a ver la diferencia con el valor 1.3al añadir o multiplicando con otro float, decimaly double.

1.3flotador AÑADIDO a 1.3de diferentes tipos:

|float              | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6    | 2.60000 |

1.3flotador MULTIPLICADO por 1.3de diferentes tipos:

| float              | double             | decimal      |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 |

Esto está usando MySQL 6.7

Consulta:

SELECT 
    float_1 + float_2 as 'float add',
    double_1 + double_2 as 'double add',
    decimal_1 + decimal_2 as 'decimal add',

    float_1 * float_2 as 'float multiply',
    double_1 * double_2 as 'double multiply',
    decimal_1 * decimal_2 as 'decimal multiply'
FROM numerics

Crear tabla e insertar datos:

CREATE TABLE `numerics` (
  `float_1` float DEFAULT NULL,
  `float_2` float DEFAULT NULL,
  `double_1` double DEFAULT NULL,
  `double_2` double DEFAULT NULL,
  `decimal_1` decimal(10,5) DEFAULT NULL,
  `decimal_2` decimal(10,5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `_numerics` 
    (
        `float_1`,
        `float_2`,
        `double_1`,
        `double_2`,
        `decimal_1`,
        `decimal_2`
    )
VALUES
    (
        1.3,
        1.3,
        1.3,
        1.3,
        1.30000,
        1.30000
    );

11

FLOAT almacena números de punto flotante con precisión de hasta ocho lugares y tiene cuatro bytes, mientras que DOUBLE almacena números de punto flotante con precisión de hasta 18 lugares y tiene ocho bytes.


11

Float tiene 32 bits (4 bytes) con una precisión de 8 lugares. Double tiene 64 bits (8 bytes) con una precisión de 16 lugares.

Si necesita una mayor precisión, use Double en lugar de Float .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.