MySQL: Яка різниця між float і double?


110

Перевіряючи нову структуру бази даних, я побачив, що хтось змінив поле з float на double. Цікаво, чому я перевірив документацію на mysql, але чесно не зрозумів, у чому різниця.

Може хтось пояснить?



1
Я припускаю , що ви мали в виду це посилання: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
Арун

Це могло б бути більш корисним: stackoverflow.com/questions/5150274 / ...
IFTI Махмуд

Також актуально: Пункт №5 за адресою dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html
rinogo

Відповіді:


106

Вони обидва представляють числа з плаваючою комою. A FLOAT- для одноточної, а a DOUBLE- для подвійної точності чисел.

MySQL використовує чотири байти для значень одноточності та вісім байтів для значень подвійної точності.

Існує велика різниця від чисел з плаваючою комою та десяткових (числових) чисел, які ви можете використовувати з DECIMALтипом даних. Це використовується для зберігання точних числових значень даних, на відміну від цифр з плаваючою комою, де важливо зберегти точну точність, наприклад, з грошовими даними.


27
ви можете детальніше розібратися з прикладом
Кайлас

4
@Kailas Поплавці округляються, а десяткові знаки - ні. Десяткові (9,3) можуть бути, наприклад, 123456.789, тоді як якщо ви спробуєте зберегти 123456.789, він буде вставлений як 123456.0 як поплавок.
Блейк

76

Можливо, цей приклад міг би пояснити.

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

У нас є така таблиця:

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

Для першої різниці ми намагаємося вставити запис з "1,2" у кожне поле:

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

Таблиця із таким виглядом:

SELECT * FROM `test`;

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

Бачите різницю?

Спробуємо наступний приклад:

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

Хола! Ми можемо знайти різницю так:

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

1
Можливо, кращим порівнянням було б також давання fla та flb 2 десяткових знаків. float(10, 2)
Вдячний

30

Дублі - це як плавки, за винятком того, що вони вдвічі більше. Це дозволяє підвищити точність.


Зауважте, що плавання і подвійні круги після деякого моменту. Наприклад, 100000.1 скорочується до 100000 як поплавок.
Блейк

14

Думав , що я хотів би додати свій власний приклад , який допоміг мені побачити різницю , використовуючи значення 1.3при додаванні або множення з іншим float, decimalі double.

1.3float доданий до 1.3різних типів:

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

1.3поплавця МНОГОПРИКЛАДНО 1.3різних типів:

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

Для цього використовується MySQL 6.7

Запит:

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

Створіть таблицю та вставте дані:

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 зберігає номери з плаваючою комою з точністю до восьми місць і має чотири байти, а DOUBLE зберігає числа з плаваючою комою з точністю до 18 місць і має вісім байтів.


11

Float має 32 біт (4 байти) з точністю до 8 місць. Double має 64 біт (8 байт) з точністю до 16 місць.

Якщо вам потрібна краща точність, використовуйте Double замість Float .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.