MySQL: float ve double arasındaki fark nedir?


110

Yeni veritabanı yapısını kontrol ederken, birinin bir alanı float'tan double'a değiştirdiğini gördüm. Nedenini merak ediyorum, mysql belgelerini kontrol ettim, ancak dürüst olmak gerekirse farkın ne olduğunu anlamadım.

Biri açıklayabilir mi?



1
Sanırım bu bağlantıyı kastettiniz: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
2014


Yanıtlar:


106

Her ikisi de kayan nokta sayılarını temsil eder. A FLOAT, tek DOUBLEduyarlıklı sayılar , a ise çift duyarlıklı sayılar içindir.

MySQL, tek duyarlıklı değerler için dört bayt ve çift duyarlıklı değerler için sekiz bayt kullanır.

DECIMALVeri türü ile kullanabileceğiniz kayan nokta sayıları ve ondalık (sayısal) sayılardan büyük bir fark vardır . Bu, örneğin parasal verilerde kesin kesinliğin korunmasının önemli olduğu kayan noktalı sayılardan farklı olarak tam sayısal veri değerlerini depolamak için kullanılır.


27
bir örnekle detaylandırır mısın
Kailas

4
@Kailas Floats yuvarlanır ve ondalık sayılar yuvarlanmaz. Ondalık (9,3) örneğin 123456.789 olabilir, oysa 123456.789'u kaydetmeye çalışırsanız, kayan nokta olarak 123456.0 olarak eklenir.
Blake

76

Belki bu örnek açıklayabilir.

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

Bunun gibi bir masamız var:

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

İlk fark için, her alana '1.2' ile bir kayıt eklemeye çalışıyoruz :

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

Aşağıdaki gibi gösteren tablo:

SELECT * FROM `test`;

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

Farkı gör?

Bir sonraki örneğe çalışıyoruz:

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

Hola! Farkı şu şekilde bulabiliriz:

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

1
Belki daha iyi bir karşılaştırma fla ve flb'ye 2 ondalık sayı vermek olabilirdi. float(10, 2)
Minnettar

30

Çiftler, iki kat daha büyük olmaları haricinde, tıpkı şamandıralar gibidir. Bu, daha fazla doğruluk sağlar.


Bir noktadan sonra yüzer ve iki katına çıktığını unutmayın. Örneğin, 100000.1, bir kayan nokta olarak 100000'e keser.
Blake

14

Düşünce Bana değerini kullanarak farkı görmek yardımcı kendi örneğini eklersiniz 1.3ekleyerek veya birbiriyle çarpılması zaman float, decimalve double.

1.3float ADDED to 1.3of different types:

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

1.3float MULTIPLIED 1.3farklı türlere göre:

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

Bu MySQL 6.7 kullanıyor

Sorgu:

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

Tablo Oluşturun ve Veri Girin:

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 kayan nokta numaralarını sekiz basamağa kadar doğrulukla depolar ve dört bayta sahipken, DOUBLE kayan nokta sayılarını 18 basamağa kadar doğrulukla depolar ve sekiz bayta sahiptir.


11

Float , 8 yer doğruluğu ile 32 bit (4 bayt) değerine sahiptir. Double , 16 yer doğruluğu ile 64 bit'e (8 bayt) sahiptir.

Daha iyi doğruluğa ihtiyacınız varsa Float yerine Double kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.