2010-01-29 42 views
73

Comprobando 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 sinceramente no entendí cuál es la diferencia.MySQL: ¿Cuál es la diferencia entre float y double?

¿Alguien puede explicar?

+2

Tenga en cuenta que [ "Uso FLOAT le puede dar algunos problemas inesperados, porque todos los cálculos en MySQL se realizan con doble precisión"] (http://dev.mysql.com /doc/refman/5.0/en/numeric-type-overview.html) –

+1

Supongo que quería decir este enlace: http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html – arun

+0

Esto podría ser más útil: http://stackoverflow.com/questions/5150274/difference-between-float-and-decimal-data-type –

Respuesta

78

Ambos representan números en coma flotante. Un FLOAT es para precisión simple, mientras que un DOUBLE es para números de precisión doble.

MySQL utiliza 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 punto flotante y los números decimales (numéricos), que puede usar con el tipo de datos DECIMAL. 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.

+0

De acuerdo, tiene sentido. ¡Gracias! – janpio

+15

puede elaborar con el ejemplo – Kailas

+0

@Kailas Flotantes 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

26

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

+0

Tenga en cuenta que flota y se duplica después de cierto punto. Por ejemplo 100000.1 trunca a 100000 como un flotante. – Blake

8

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

49

Quizás este ejemplo podría explicar.

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

tenemos una tabla como esta:

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

Por primera diferencia, tratamos de insertar un registro con '1.2' a cada campo:

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

La mesa mostrando de esta manera:

SELECT * FROM `test`; 

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

Ver los diferentes?

Tratamos de ejemplo siguiente:

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

Hola! Podemos encontrar los diferentes así:

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

Quizás una mejor comparación habría sido dar fla y flb 2 decimales también. 'flotar (10, 2)' – Grateful

7

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

Si necesita una mayor precisión, utilice doble lugar de flotador.

Pensamiento
2

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

1.3 flotador añaden a 1.3 de diferentes tipos:

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

1.3 flotador multiplicado por 1.3 de diferentes tipos:

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

Esto es 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 
    ); 
Cuestiones relacionadas