views:

592

answers:

5

I am trying to do a SELECT match on a table based upon an identifier and a price, such as:

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

The above returns zero rows, while if you remove the price='101.31' bit it returns the correct row.

Doing a...

SELECT * FROM `table`;

Returns the same row as above and quite clearly states that price='101.31'. Yet select fails to match it. Changing = to <= makes it work - but this is not exactly a solution.

Is there a way of casting the MySQL float to 2 digits before the operation is performed on it, thus making the above SELECT work (or some other solution)?

Thanks!

A: 

Perhaps something along these lines:

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01;
LorenVS
+3  A: 

It doesn't work because a float is inherently imprecise. The actual value is probably something like '101.3100000000001' You could use ROUND() on it first to round it to 2 places, or better yet use a DECIMAL type instead of a float.

Eric Petroelje
+3  A: 

Hi Meep3D. Casting to a decimal worked for me:

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

However, you may want to consider just making the price column a DECIMAL in the first place. DECIMAL is generally considered to be the best type to use when dealing with monetary values.

Matt Solnit
+1  A: 

Don't ever use floats for money.

jcdyer
Where do I get change for the customer from? (sorry, a bit of shopkeeper humour there :)
Meep3D
A: 

Does this work?

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