Frage

ich in ein Problem lief von Floating-Point-Spalten in dem MySQL-Datenbank-Schema einzuführen, dass die Vergleiche auf Gleitkommawerte haben immer die richtigen Ergebnisse nicht zurück.

1 bis 50,12
2-34,57
3-12,75
4 - ... (Rest alle weniger als 12.00)

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

Das gibt mir "3".

Ich habe gelesen, dass die Vergleiche von Gleitkommazahlen in MySQL ist eine schlechte Idee und Dezimal-Typ ist die bessere Option.

habe ich jede Hoffnung auf voran mit dem Schwimmer-Typ und erhält die Vergleiche zur Arbeit richtig?

War es hilfreich?

Lösung

Haben Sie das Problem unten bemerkt?

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;
+-----------------+
| SUM(num)        |
+-----------------+
| 159.94000005722 | 
+-----------------+

Es gibt eine zusätzliche 0.00000005722 Spanne zwischen einigen dieser Zeilen. Daher werden einige dieser Werte false zurück, wenn sie mit dem Wert verglichen sie mit initialisiert wurden.

Zur Vermeidung von Problemen mit Fließkommaarithmetik und Vergleichen, sollten Sie den DECIMAL Datentyp:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
|   159.94 | 
+----------+
1 row in set (0.00 sec)

Andere Tipps

Ich habe Gesicht dem ähnliche Problem einmal. Konvertieren Sie das ‚schweben‘ Feld ‚Dezimal‘. Es wird auf jeden Fall das Problem lösen.

Ich mache das

WHERE abs(value - 12.75)<0.001

, aber ich stimme zu, kann jede Sprache float Gleichheit vergleichen und wenn gespeicherten Werte gleich genaue Zahlen Werte, die Sie Ihnen dort eingefügt, sollte kein Problem sein

mit nur ein paar Dezimalstellen und exakter Anpassung Werten, Präzisionsfehler nicht klingt wie ein offensichtlicher Grund für diese Diskrepanzen in MySQL

Es ist ein Floating-Point, so was ist das Problem? 3 könnte das richtige Ergebnis sein, hängt davon ab, was die Datenbank denkt über 12.75. Ist es 12,75 oder nur ein wenig mehr?

Verwenden DECIMAL wenn Sie genaue Zahlen.

Es gibt ein Problem mit dem Vergleich des Schwimmer für die Gleichstellung. Dies kann nicht vorhergesagten Ergebnissen führen. Dies ist aufgrund der internen Umsetzung von Punkt arithmetics schweben.

Beim Vergleich eine Zahl mit einem String?

Verwenden REAL statt FLOAT oder DECIMAL.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top