Heim >Datenbank >MySQL-Tutorial >Warum liefert MySQL beim Vergleich von Gleitkommazahlen unerwartete Ergebnisse?

Warum liefert MySQL beim Vergleich von Gleitkommazahlen unerwartete Ergebnisse?

Linda Hamilton
Linda HamiltonOriginal
2024-11-10 16:34:02857Durchsuche

Why does MySQL return unexpected results when comparing floating-point numbers?

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!

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