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!