MySQL: в чем разница между float и double?

110

Проверяя новую структуру базы данных, я увидел, что кто-то изменил значение поля с float на double. Интересно, почему, я проверил документацию mysql, но, честно говоря, не понял, в чем разница.

Кто-нибудь может объяснить?

Janpio
источник
1
Думаю, вы имели в виду эту ссылку: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
arun
Это может быть более полезно: stackoverflow.com/questions/5150274/…
Ифти Махмуд
Также актуально: Пункт № 5 на dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html
rinogo

Ответы:

106

Оба они представляют собой числа с плавающей запятой. A FLOATдля чисел с одинарной точностью, а DOUBLEдля чисел с двойной точностью.

MySQL использует четыре байта для значений с одинарной точностью и восемь байтов для значений с двойной точностью.

Существует большое отличие от чисел с плавающей запятой и десятичных (числовых) чисел, которые вы можете использовать с DECIMALтипом данных. Это используется для хранения точных числовых значений данных, в отличие от чисел с плавающей запятой, где важно сохранить точную точность, например, с денежными данными.

Даниэль Вассалло
источник
27
не могли бы вы уточнить на примере
Кайлас
4
@Kailas Floats округляются, а десятичные - нет. Десятичное число (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)
Grateful
30

Двойники похожи на поплавки, за исключением того, что они вдвое больше. Это позволяет добиться большей точности.

Уильямс Тотланд
источник
Обратите внимание, что через какой-то момент округляется и удваивается. Например, 100000.1 усекается до 100000 как число с плавающей запятой.
Блейк
14

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

1.3поплавки ДОБАВЛЕНЫ в 1.3разные типы:

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

1.3float, УМНОЖЕННЫЙ 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 разрядов и имеет восемь байтов.

user3902486
источник
11

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

Если вам нужна более высокая точность, используйте Double вместо Float .

Рави Патель
источник