2010-01-29 7 views
73

Проверка в новой структуре базы данных Я видел, что кто-то изменил поле с float на double. Интересно, почему, я проверил документацию mysql, но честно не понял, в чем разница.MySQL: В чем разница между float и double?

Может кто-нибудь объяснить?

+2

Обратите внимание, что [ «Использование FLOAT может дать вам некоторые неожиданные проблемы, потому что все вычисления в MySQL выполняются с двойной точностью»] (http://dev.mysql.com /doc/refman/5.0/en/numeric-type-overview.html) –

+1

Я предполагаю, что вы имели в виду эту ссылку: http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html – arun

+0

Это могло бы быть более полезным: http://stackoverflow.com/questions/5150274/difference-between-float-and-decimal-data-type –

ответ

78

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

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

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

+0

Хорошо, имеет смысл. Благодаря! – janpio

+15

Можете ли вы подробно остановиться на примере – Kailas

+0

. Поплавки Qailas округлены, а десятичные знаки - нет. Десятичный (9,3) может быть, например, 123456.789, тогда как если бы вы попытались сохранить 123456.789, он вставил бы как 123456.0 в качестве поплавка. – Blake

26

Удваиваются как плавающие, за исключением того факта, что они в два раза больше. Это позволяет повысить точность.

+0

Обратите внимание, что после некоторой точки плавает и удваивается. Например, 100000.1 обрезает до 100000 в качестве поплавка. – Blake

8

FLOAT хранит номера с плавающей точкой с точностью до восьми мест и имеет четыре байта, в то время как DOUBLE хранит числа с плавающей запятой с точностью до 18 мест и имеет восемь байтов.

49

Возможно, этот пример может объяснить.

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

Hola! Мы можем найти различные, как это:

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

Возможно, лучшим сравнением было бы дать fla и flb 2 десятичные точки. 'float (10, 2)' – Grateful

7

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

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

2

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

1.3 поплавка добавлен в 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 
    ); 
Смежные вопросы