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.