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ć?




To może być bardziej pomocne: stackoverflow.com/questions/5150274/ ...
Ifti Mahmud

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.


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 |
+--------------------+---------+

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ść.


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
    );

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.


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.