2010-01-29 2 views
73

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

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

+2

참고 [ "MySQL의 모든 계산은 이중 정밀도로 수행되기 때문에 FLOAT를 사용하여 몇 가지 예상치 못한 문제를 줄 수도"] (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은 단 정밀도 값에는 4 바이트를 사용하고 배정도 값에는 8 바이트를 사용합니다.

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

+0

좋습니다. 감사! – janpio

+15

예 – Kailas

+0

으로 자세히 설명해 주실 수 있습니까? @ 카일 러스 수레는 반올림되고 소수는 그렇지 않습니다. 십진수 (9,3)는 예를 들어 123456.789 일 수 있지만 123456.789를 저장하려고 시도하면 123456.0이 부동 소수점으로 삽입됩니다. – Blake

26

두 배는 두 배 큰 사실을 제외하고는 수레와 같습니다. 이것은 더 큰 정확도를 허용합니다.

+0

수 요와 복식은 어느 시점 이후에 반올림됨에 유의하십시오. 예를 들어, 100000.1은 100000을 float로 자릅니다. – Blake

8

FLOAT는 부동 소수점 수를 최대 8 개까지 저장하고 4 바이트를 저장하지만 DOUBLE은 부동 소수점 수를 최대 18 자리까지 저장하며 8 바이트를 저장합니다.

49

아마도이 예가 설명 할 수 있습니다.

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

표를 첫째 차이

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

, 우리는 각 필드에 '1.2'에 레코드를 삽입하려고 :

CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,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 | 
+--------------------+---------+ 
+0

아마도 fla와 flb에 소수점 2 개를 더 잘 비교했을 것입니다. 'float (10, 2)' – Grateful

7

플로트 8 곳 정확도와 32 비트 (4 바이트)가 있습니다. 은 16 비트 정확도의 64 비트 (8 바이트)입니다. 당신이 더 정확성을 필요로하는 경우

, 더블 대신 의 플로트를 사용합니다.

2

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

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

1.3 플로트 다른 유형의 1.3 곱한 :

1.3 플로트는 다른 유형의 1.3에 추가 이것은 MySQL의 6.7을 사용하고

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

검색어 :

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 
    ); 
관련 문제