Heim  >  Artikel  >  Datenbank  >  Warum sind MySQL-Gleitkommavergleiche ungenau?

Warum sind MySQL-Gleitkommavergleiche ungenau?

Susan Sarandon
Susan SarandonOriginal
2024-11-07 12:12:02437Durchsuche

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)

Ausführen der Abfrage:

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

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

Ausführen der Abfrage:

SELECT SUM(num) FROM a;

liefert das Ergebnis:

159.94000005722

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;

Das Ergebnis lautet nun:

159.94

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!

Stellungnahme:
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