MySQL: Jaka jest różnica między float a double?

110

Sprawdzając nową strukturę bazy danych zauważyłem, że ktoś zmienił pole z float na double. Zastanawiając się dlaczego, sprawdziłem dokumentację mysql, ale szczerze mówiąc nie rozumiałem, na czym polega różnica.

Czy ktoś może wyjaśnić?

janpio
źródło

Odpowiedzi:

106

Obie reprezentują liczby zmiennoprzecinkowe. A FLOAToznacza pojedynczą precyzję, a a DOUBLEpodwójną precyzję.

MySQL wykorzystuje cztery bajty na wartości o pojedynczej precyzji i osiem bajtów na wartości o podwójnej precyzji.

Istnieje duża różnica między liczbami zmiennoprzecinkowymi a liczbami dziesiętnymi (numerycznymi), których można używać z DECIMALtypem danych. Służy do przechowywania dokładnych liczbowych wartości danych, w przeciwieństwie do liczb zmiennoprzecinkowych, gdzie ważne jest zachowanie dokładnej precyzji, na przykład w przypadku danych pieniężnych.

Daniel Vassallo
źródło
27
czy możesz rozwinąć na przykładzie
Kailas,
4
@Kailas Floats są zaokrąglane, a dziesiętne nie. Dziesiętna (9,3) może być na przykład 123456.789, podczas gdy gdybyś próbował zapisać 123456.789, zostałby wstawiony jako 123456.0 jako liczba zmiennoprzecinkowa.
Blake
76

Być może ten przykład mógłby wyjaśnić.

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

Mamy taki stół:

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

Dla pierwszej różnicy próbujemy wstawić rekord z wartością „1,2” w każdym polu:

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

Tabela pokazująca w ten sposób:

SELECT * FROM `test`;

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

Zobacz różnicę?

Próbujemy przejść do następnego przykładu:

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

Hola! Różnicę możemy znaleźć w ten sposób:

+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+
I jest.
źródło
1
Być może lepszym porównaniem byłoby podanie fla i flb również 2 miejsc po przecinku. float(10, 2)
Wdzięczny
30

Podwójne są jak pływaki, z wyjątkiem tego, że są dwa razy większe. Pozwala to na większą dokładność.

Williham Totland
źródło
Zauważ, że po pewnym czasie płynie i podwaja się. Na przykład 100000,1 obcina do 100000 jako liczba zmiennoprzecinkowa.
Blake
14

Myśl Chciałbym dodać własnym przykładzie, że pomógł mi zobaczyć różnicę przy użyciu wartości 1.3podczas dodawania lub mnożenia z innym float, decimali double.

1.3float DODANO do 1.3różnych typów:

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

1.3float MULTIPLIED przez 1.3różne typy:

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

Używa MySQL 6.7

Pytanie:

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

Utwórz tabelę i wstaw dane:

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
    );
Omar
źródło
11

FLOAT przechowuje liczby zmiennoprzecinkowe z dokładnością do ośmiu miejsc i ma cztery bajty, podczas gdy DOUBLE przechowuje liczby zmiennoprzecinkowe z dokładnością do 18 miejsc i ma osiem bajtów.

user3902486
źródło
11

Float ma 32 bity (4 bajty) z dokładnością do 8 miejsc. Double ma 64 bity (8 bajtów) z dokładnością do 16 miejsc.

Jeśli potrzebujesz większej dokładności, użyj Double zamiast Float .

Ravi Patel
źródło