MySQL : float와 double의 차이점은 무엇입니까?


110

새로운 데이터베이스 구조를 확인하면서 누군가 필드를 float에서 double로 변경 한 것을 보았습니다. 이유가 궁금해서 mysql 문서를 확인했지만 솔직히 차이점이 무엇인지 이해하지 못했습니다.

누군가 설명 할 수 있습니까?



1
이 링크를 의미한다고 생각합니다 : dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
arun

이것은 더 도움이 될 수 있습니다 stackoverflow.com/questions/5150274/...
Ifti 마흐무드

답변:


106

둘 다 부동 소수점 숫자를 나타냅니다. A FLOAT는 단 정밀도이고 a DOUBLE는 배정 밀도 숫자입니다.

MySQL은 단 정밀도 값에 4 바이트를 사용하고 배정 밀도 값에 8 바이트를 사용합니다.

DECIMAL데이터 유형 과 함께 사용할 수있는 부동 소수점 숫자 및 10 진수 (숫자)와는 큰 차이가 있습니다 . 이는 통화 데이터와 같이 정확한 정밀도를 유지하는 것이 중요한 부동 소수점 숫자와 달리 정확한 숫자 데이터 값을 저장하는 데 사용됩니다.


27
당신은 예와 함께 자세히 설명 할 수
Kailas

4
@Kailas Floats는 반올림되고 소수는 그렇지 않습니다. Decimal (9,3)은 예를 들어 123456.789가 될 수 있지만 123456.789를 저장하려고하면 부동 소수점으로 123456.0으로 삽입됩니다.
Blake

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으로 자릅니다.
Blake

14

생각 나는 날이 값을 사용하여 차이를 볼 도움이 내 자신의 예를 추가 할 것입니다 1.3추가하거나 서로 곱하면 float, decimal,와 double.

1.31.3다른 유형의 ADDED 부동 :

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

1.3float MULTIPLIED by 1.3of different types :

| 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는 최대 8 자리의 정확도로 부동 소수점 숫자를 저장하고 4 바이트를 포함하는 반면 DOUBLE은 최대 18 자리의 정확도로 8 바이트의 부동 소수점 숫자를 저장합니다.


11

Float 에는 8 자리 정확도의 32 비트 (4 바이트)가 있습니다. 더블 은 16 자리 정확도로 64 비트 (8 바이트)를가집니다.

더 나은 정확도가 필요한 경우 Float 대신 Double을 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.