Wenn ein Preis in einer Zeile 38.03
ist, sollten die folgenden Sucheinschränkungen alle die Zeile zurückgeben, die das Ergebnis enthält.
WHERE price >= '38.02' AND price <= '38.03'
(Das funktioniert)
WHERE price >= '20' AND price <= '100'
(Das funktioniert)
WHERE price >= '38.03' AND price <= '38.03'
(Dies funktioniert nicht)
WHERE price >= '38.03' AND price <= '100'
(Dies funktioniert nicht)
WHERE price >= '38.03'
(Dies funktioniert nicht)
WHERE price <= '38.03'
(Das funktioniert)
Der Preis wird als Float im DB gespeichert.
Im Grunde funktioniert <=
, während >=
nicht funktioniert. Gibt es einen Grund, warum das sein könnte?
Beachten Sie, dass float
ein fehlerhafter Datentyp ist, wenn es um Genauigkeit geht. Wenn Sie 12
als float darstellen, erhalten Sie 11.99999999999998
oder etwas.
'38.03'
kann in dezimal konvertiert werden, oder ein anderer Datentyp, der genauer ist (abhängig von RDBMS, ich bin hier allgemein), und es wird sich vom float-Wert unterscheiden.
float ist 32 bit, geringe Genauigkeit. Double funktioniert viel besser und ist 64-Bit-Datentyp. Der Dezimaldatentyp in einigen Systemen sind 128-Bit-numerische Datentypen zum Speichern sehr genauer numerischer Werte und werden normalerweise zum Bezeichnen von Geld verwendet.
Und, überspringen Sie die Gewohnheit des Vergleichs mit dem Operator =
, von float
-Werten. Floats werden für ungefähre und schnelle Berechnungen verwendet, und nur der Vergleich mit einem Bereich ist zulässig, um den Wert von float
zu überprüfen. Das gilt grundsätzlich für jedes einzelne System.