MySQL: Was ist der Unterschied zwischen float und double?


108

Beim Einchecken der neuen Datenbankstruktur habe ich festgestellt, dass jemand ein Feld von float in double geändert hat. Ich fragte mich warum, überprüfte die MySQL-Dokumentation, verstand aber ehrlich gesagt nicht, was der Unterschied ist.

Kann jemand erklären?



1
Ich denke, Sie meinten diesen Link: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
Arun

Dies könnte hilfreicher sein: stackoverflow.com/questions/5150274/…
Ifti Mahmud

Antworten:


105

Sie repräsentieren beide Gleitkommazahlen. A FLOATsteht für einfache Genauigkeit, während a DOUBLEfür Zahlen mit doppelter Genauigkeit steht.

MySQL verwendet vier Bytes für Werte mit einfacher Genauigkeit und acht Bytes für Werte mit doppelter Genauigkeit.

Es gibt einen großen Unterschied zwischen Gleitkommazahlen und Dezimalzahlen, die Sie mit dem DECIMALDatentyp verwenden können. Dies wird verwendet, um genaue numerische Datenwerte zu speichern, im Gegensatz zu Gleitkommazahlen, bei denen es wichtig ist, die genaue Genauigkeit beizubehalten, beispielsweise bei Gelddaten.


27
Können Sie mit Beispiel
näher

4
@ Kailas Floats werden gerundet und Dezimalstellen nicht. Dezimal (9,3) könnte beispielsweise 123456.789 sein, während beim Versuch, 123456.789 zu speichern, 123456.0 als Float eingefügt wird.
Blake

76

Vielleicht könnte dieses Beispiel erklären.

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

Wir haben einen Tisch wie diesen:

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

Für den ersten Unterschied versuchen wir , in jedes Feld einen Datensatz mit '1.2' einzufügen :

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

Die Tabelle sieht folgendermaßen aus:

SELECT * FROM `test`;

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

Sieh den Unterschied?

Wir versuchen zum nächsten Beispiel:

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

Hallo! Wir können den Unterschied so finden:

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

1
Vielleicht wäre ein besserer Vergleich gewesen, fla und flb auch 2 Dezimalstellen zu geben. float(10, 2)
Dankbar

29

Doppel sind wie Schwimmer, nur dass sie doppelt so groß sind. Dies ermöglicht eine größere Genauigkeit.


Beachten Sie, dass nach einiger Zeit schwimmt und sich verdoppelt. Zum Beispiel wird 100000.1 als Float auf 100000 abgeschnitten.
Blake

14

Dachte , ich würde mein eigenes Beispiel hinzufügen , die mir geholfen , den Unterschied mit dem Wert sehen 1.3beim Hinzufügen oder mit einem anderen multipliziert float, decimalund double.

1.3float Hinzugefügt 1.3von verschiedenen Typen:

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

1.3float MULTIPLIED von 1.3verschiedenen Typen:

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

Dies verwendet MySQL 6.7

Abfrage:

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

Tabelle erstellen und Daten einfügen:

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 speichert Gleitkommazahlen mit einer Genauigkeit von bis zu acht Stellen und hat vier Bytes, während DOUBLE Gleitkommazahlen mit einer Genauigkeit von bis zu 18 Stellen und acht Bytes speichert.


11

Float hat 32 Bit (4 Bytes) mit einer Genauigkeit von 8 Stellen. Doppelt hat 64 Bit (8 Bytes) mit einer Genauigkeit von 16 Stellen.

Wenn Sie eine bessere Genauigkeit benötigen, verwenden Sie Double anstelle von Float .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.