2010-01-29 13 views
73

Beim Einchecken der neuen Datenbankstruktur habe ich gesehen, dass jemand ein Feld von Float auf Double geändert hat. Ich frage mich, warum, ich überprüfte die MySQL-Dokumentation, aber ehrlich gesagt nicht verstanden, was der Unterschied ist.MySQL: Was ist der Unterschied zwischen Float und Double?

Kann jemand erklären?

+2

Beachten Sie, dass [ „FLOAT verwenden könnten Sie einige unerwartete Probleme geben, weil alle Berechnungen in MySQL mit doppelter Genauigkeit durchgeführt werden“] (http://dev.mysql.com /doc/refman/5.0/en/numeric-type-overview.html) –

+1

Ich glaube, du meintest diesen Link: http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html – arun

+0

Dies könnte hilfreicher sein: http://stackoverflow.com/questions/5150274/difference-between-float-and-decimal-data-type –

Antwort

78

Sie beide stellen Gleitkommazahlen dar. A FLOAT ist für Single-Precision, während DOUBLE für Double-Precision-Nummern ist.

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

Es gibt einen großen Unterschied zu Fließkommazahlen und dezimalen (numerischen) Zahlen, die Sie mit dem Datentyp DECIMAL verwenden können. Dies wird verwendet, um genaue numerische Datenwerte zu speichern, im Gegensatz zu Fließkommazahlen, bei denen es wichtig ist, die exakte Genauigkeit beizubehalten, beispielsweise bei monetären Daten.

+0

Okay, macht Sinn. Vielen Dank! – janpio

+15

können Sie mit Beispiel – Kailas

+0

@Kailas Floats erhalten abgerundet und Dezimalzahlen nicht. Dezimal (9,3) könnte zum Beispiel 123456.789 sein, wohingegen wenn Sie versuchen würden, 123456.789 zu speichern, würde es als 123456.0 als Float eingefügt werden. – Blake

26

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

+0

Beachten Sie, dass float und double nach einem gewissen Punkt runden. Zum Beispiel schneidet 100000.1 als Float auf 100000 ab. – Blake

8

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 speichert und acht Bytes hat.

49

Vielleicht könnte dieses Beispiel erklären.

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

Wir haben eine Tabelle wie folgt aus:

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

Für erste Unterschied, wir versuchen, einen Datensatz mit '1.2' einzufügen jedem Feld:

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

Der Tisch zeigt so:

SELECT * FROM `test`; 

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

Siehe die verschiedenen?

Wir versuchen, zum nächsten Beispiel:

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

Hola! Wir können die verschiedenen wie diese finden:

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

Vielleicht wäre ein besserer Vergleich gewesen, um fla und flb 2 Dezimalstellen zu geben. 'float (10, 2)' – Grateful

7

Float 32 Bit hat (4 Byte) mit 8 Plätze Genauigkeit. Double hat 64 Bit (8 Bytes) mit 16 Stellen Genauigkeit.

Wenn Sie eine höhere Genauigkeit benötigen, verwenden Doppel statt von Float.

2

Gedanken würde ich mein eigenes Beispiel hinzufügen, die ich die Differenz mit dem Wert 1.3 sehen half beim Hinzufügen oder mit einer anderen float multipliziert, decimal und double.

1.3 Schwimmer hinzugefügt, um 1.3 unterschiedlicher Typen:

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

1.3 float Multipliziert mit 1.3 unterschiedlicher Typen:

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

Diese 6.7 MySQL unter Verwendung

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 
    ); 
Verwandte Themen