MySQL, das größer oder gleich dem Operator ist, ignoriert seine oder gleiche Verpflichtung

8

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?

    
bcmcfc 08.09.2010, 11:21
quelle

2 Antworten

23

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.

    
AlexanderMP 08.09.2010, 11:25
quelle
0

Wenn Sie Anführungszeichen (') verwenden, werden Ihre Variablen als Strings behandelt. Ich denke, das ist dein Problem.

Versuchen Sie: WO Preis & gt; = 38.03 UND Preis & lt; = 38.03

    
Johan 08.09.2010 11:25
quelle

Tags und Links