Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum sind MySQL-Gleitkommavergleiche ungenau?

Susan Sarandon
Freigeben: 2024-11-07 12:12:02
Original
456 Leute haben es durchsucht

Why Are MySQL Floating-Point Comparisons Inaccurate?

Unvollkommenheiten beim MySQL-Gleitkomma-Vergleich

Während sich die Einführung von Gleitkomma-Spalten in ein MySQL-Datenbankschema als nützlich erweist, können Vergleiche mit Gleitkommawerten gelegentlich zu Ergebnissen führen unzuverlässige Ergebnisse.

Zur Demonstration:

Betrachten Sie eine Tabelle mit einer Punktespalte, die Folgendes enthält: die folgenden Werte:

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(all other values are less than 12.00)
Nach dem Login kopieren

Ausführen der Abfrage:

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Nach dem Login kopieren

gibt unerwartet „3“ zurück.

Es ist eine bekannte Tatsache, dass MySQL-Vergleiche von Gleitkommawerten durchgeführt werden anfällig für Inkonsistenzen ist und dass der dezimale Datentyp hierfür die bessere Wahl ist Vergleiche.

Können Sie weiterhin den Float-Typ verwenden?

Während es allgemein empfohlen wird, den Datentyp DECIMAL für präzise Gleitkommavergleiche zu verwenden, können Sie trotzdem mit dem fortfahren float-Typ, wenn Sie sich seiner potenziellen Fallstricke bewusst sind. Eine solche Gefahr ist die Möglichkeit eines leichten Präzisionsverlusts bei Berechnungen.

Betrachten wir zum Beispiel die folgende Tabelle:

CREATE TABLE a (num float);

INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);
Nach dem Login kopieren

Ausführen der Abfrage:

SELECT SUM(num) FROM a;
Nach dem Login kopieren

liefert das Ergebnis:

159.94000005722
Nach dem Login kopieren

Beachten Sie das unerwartete „0,00000005722.“ Solche Rundungsfehler können zu Diskrepanzen bei Vergleichen führen.

Um solche Probleme zu mildern, können Sie die Float-Spalten in einen DECIMAL-Datentyp mit einer bestimmten Genauigkeit und Skalierung konvertieren. Zum Beispiel:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
Nach dem Login kopieren

Das Ergebnis lautet nun:

159.94
Nach dem Login kopieren

Durch die Verwendung des Datentyps DECIMAL können Sie genaue Vergleiche sicherstellen und die Präzisionsprobleme vermeiden, die mit Gleitkommawerten in MySQL verbunden sind .

Das obige ist der detaillierte Inhalt vonWarum sind MySQL-Gleitkommavergleiche ungenau?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage