2009-08-19 17 views
21

que estoy tratando de hacer un partido SELECT en una mesa sobre la base de un identificador y un precio, como por ejemplo:Selección de un flotador en MySQL

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31'; 

Los rendimientos por encima de cero filas, mientras que si se quita el bit price='101.31' devuelve la fila correcta.

... Haciendo un

SELECT * FROM `table`; 

Devuelve la misma fila que el anterior y establece con toda claridad que price='101.31'. Sin embargo, seleccionar no coincide. Cambiar = a <= lo hace funcionar, pero esto no es exactamente una solución.

¿Hay alguna manera de convertir el flotador de MySQL a 2 dígitos antes de que se realice la operación en él, haciendo que el SELECT anterior funcione (o alguna otra solución)?

Gracias!

Respuesta

35

La conversión a un número decimal trabajó para mí:

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL); 

Sin embargo, es posible que desee considerar sólo hacer la columna de la price un decimal en el primer lugar. DECIMAL generalmente se considera el mejor tipo para usar cuando se trata de valores monetarios.

+4

nota: use 'DECIMAL (M, D)'. 'CAST (101.31 COMO DECIMAL) = 101' –

-1

Tal vez algo en este sentido:

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01; 
11

no funciona debido a un flotador es inherentemente imprecisa. El valor real es probablemente algo así como '101.3100000000001'. Podría usar REDONDO() primero para redondearlo a 2 lugares, o mejor aún usar un tipo DECIMAL en lugar de un flotador.

8

Nunca uses flotadores por dinero.

+6

¿De dónde obtengo el cambio para el cliente? (Lo siento, un poco de humor comerciante allí :) – Meep3D

-1

¿Funciona?

SELECT * , ROUND(price, 2) rounded 
FROM table 
WHERE ident = 'ident23' 
HAVING rounded = 101.31 
6

Hoy en día, también se encontró la misma situación y se resuelven sólo mediante el uso de la función FORMATO MySQL, devolverá los resultados que coinciden exactamente con su cláusula WHERE.

SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2) 

Explicación: FORMAT('col name', precision of floating point number)

0

que estaba buscando solución, pero finalmente lo hice usando mi anterior Number_format php(), que entró en ver @ solución de hmasif.

Uso esto y obtendrá su flotador - Partido de MySQL:

$floatmatch = number_format((float)$yourfloatvariable,5); 

donde 5 es cinco cuerdas de punto decimal. p.ej. 7.93643

Cuestiones relacionadas