Heim > Datenbank > MySQL-Tutorial > Hauptteil

Warum liefert MySQL beim Vergleich von Gleitkommazahlen unerwartete Ergebnisse?

Linda Hamilton
Freigeben: 2024-11-10 16:34:02
Original
789 Leute haben es durchsucht

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"
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

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