MySQL-Gleitkomma-Vergleichsanomalien
Gleitkommazahlen sind im Allgemeinen dafür bekannt, dass sie aufgrund ihrer Ungenauigkeit unerwartete Ergebnisse bei Vergleichen verursachen. MySQL ist von diesem Verhalten keine Ausnahme.
Stellen Sie sich dieses Szenario vor: eine MySQL-Tabelle mit einer Spalte namens „points“, die Gleitkommawerte speichert. Wenn Sie eine Abfrage wie die folgende ausführen:
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Sie können davon ausgehen, dass sie 3 zurückgibt, da es vier Werte gibt, die größer als 12,75 sind. Allerdings gibt MySQL möglicherweise nur 2 zurück.
Dieses Verhalten ist eine Folge der Art und Weise, wie Gleitkomma-Arithmetik in Computern implementiert ist. Obwohl in unserem Code Werte als „12,75“ oder „50,12“ gespeichert werden, werden diese Werte intern oft als Näherungen gespeichert.
Interna von Gleitkomma-Arithmetikfehlern
Zu Um dies zu veranschaulichen, nehmen wir die einfache Summe einiger Gleitkommazahlen:
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); SELECT SUM(num) FROM a;
Diese Abfrage könnte ein Ergebnis wie „159,94000005722“ anstelle von „159,94“ zurückgeben. Dieses zusätzliche „0,00000005722“ ist das Ergebnis von Rundungsfehlern innerhalb der Gleitkomma-Arithmetik.
Behebung des Problems mit dem Typ DECIMAL
Um solche Ungenauigkeiten zu vermeiden, wird empfohlen, Folgendes zu tun Verwenden Sie den Datentyp DECIMAL. DECIMAL stellt Werte als Zeichenfolgen mit einer festen Anzahl von Ziffern dar, anstatt sich auf Gleitkommanäherungen zu verlassen.
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a;
Mit dieser Änderung gibt die SUM-Abfrage das erwartete Ergebnis „159,94“ zurück.
Fazit
Während Gleitkommatypen für einige Anwendungen praktisch sein können, kann ihr Vergleichsverhalten in MySQL unzuverlässig sein. Für präzise Vergleiche und Berechnungen wird dringend empfohlen, stattdessen den Datentyp DECIMAL zu verwenden.
Das obige ist der detaillierte Inhalt vonWarum liefert MySQL beim Vergleich von Gleitkommazahlen unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!