2010-09-08 20 views
8

Si un precio en una fila es 38.03, entonces las siguientes restricciones de búsqueda deberían devolver la fila que contiene el resultado.MySQL mayor o igual que el operador está ignorando su obligación o igual a

WHERE price >= '38.02' AND price <= '38.03' (Esto funciona)

WHERE price >= '20' AND price <= '100' (Esto funciona)

WHERE price >= '38.03' AND price <= '38.03' (Esto no funciona)

WHERE price >= '38.03' AND price <= '100' (Esto no funciona)

WHERE price >= '38.03' (Esto no tiene no funciona)

WHERE price <= '38.03' (Esto funciona)

El precio se almacena como un flotante en la base de datos.

Así que, básicamente, <= está trabajando, mientras que >= no lo está. ¿Hay alguna razón por la que podría ser?

+1

¿Por qué necesita encerrar el valor entre comillas simples? – BoltClock

+1

¿No es esta una variación del problema clásico de comparación de coma flotante? ... Olvidé el nombre ... –

+3

Puede ser demasiado tarde ahora, pero los precios (y el dinero) siempre deben almacenarse como tipo DECIMAL, nunca flotan. http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html – msw

Respuesta

23

tener en cuenta que float es un tipo de datos defectuoso cuando se trata de precisión. Si representa 12 como flotante, obtendrá 11.99999999999998 o algo así.

'38.03' se puede convertir a decimal, u otro tipo de datos que sea más preciso (según RDBMS, estoy siendo general aquí), y diferirá del valor de coma flotante.

flotador es de 32 bit, baja precisión. El doble funciona mucho mejor, siendo el tipo de datos de 64 bits. El tipo de datos decimales en algunos sistemas son tipos de datos numéricos de 128 bits para almacenar valores numéricos muy precisos, y generalmente se usa para denominar dinero.

Y omita el hábito de comparar con el operador =, de valores float. Los flotantes se usan para cálculos aproximados y rápidos, y solo la comparación con un rango es aceptable para verificar el valor de float. Eso es válido para básicamente todos los sistemas.

+2

+1 Sí, simplemente use 'DECIMAL' en su lugar. MySQL es bastante bueno con esos. – BoltClock

+0

Incluso 128 bits no le ayudarán a expresar 0.1 exactamente. El dinero se representa mejor como partes completas y fraccionarias como números enteros. – duffymo

+0

@duffymo, estás hablando de un punto fijo decimal. Hay 2 tipos de decimal, y algunos RDBMS tienen el tipo de datos 'money', que es un decimal de punto fijo con 2-4 lugares decimales. – AlexanderMP

0

Cuando utiliza comillas (') sus variables se tratarán como cadenas. Creo que ese es tu problema.

Probar: donde el precio> = 38,03 y el precio < = 38,03

+2

Pruébelo usted mismo y notará que no hay diferencia. :) –

+0

La consulta anterior es igual a DONDE precio = 38.03 –

+2

mysql> SELECCIONAR 38.03 <= 38.03; resultado: 1 mysql> SELECCIONAR 38.03 <38.03; resultado: 0 – Johan

Cuestiones relacionadas