Search code examples
mysqlcomparisonfloating-pointselect-query

MySQL floating point comparison issues


I ran into an issue by introducing floating point columns in the MySQL database schema that the comparisons on floating point values don't return the correct results always.

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(rest all less than 12.00)

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

This returns me "3".

I have read that the comparisons of floating point values in MySQL is a bad idea and decimal type is the better option.

Do I have any hope of moving ahead with the float type and get the comparisons to work correctly?


Solution

  • Do you notice the problem below?

    CREATE TABLE a (num float);
    
    INSERT INTO a VALUES (50.12);
    INSERT INTO a VALUES (34.57);
    INSERT INTO a VALUES (12.75);
    INSERT INTO a VALUES (11.22);
    INSERT INTO a VALUES (10.46);
    INSERT INTO a VALUES (9.35);
    INSERT INTO a VALUES (8.55);
    INSERT INTO a VALUES (7.23);
    INSERT INTO a VALUES (6.53);
    INSERT INTO a VALUES (5.15);
    INSERT INTO a VALUES (4.01);
    
    SELECT SUM(num) FROM a;
    +-----------------+
    | SUM(num)        |
    +-----------------+
    | 159.94000005722 | 
    +-----------------+
    

    There's an extra 0.00000005722 spread between some of those rows. Therefore some of those values will return false when compared with the value they were initialized with.

    To avoid problems with floating-point arithmetic and comparisons, you should use the DECIMAL data type:

    ALTER TABLE a MODIFY num DECIMAL(6,2);
    
    SELECT SUM(num) FROM a;
    +----------+
    | SUM(num) |
    +----------+
    |   159.94 | 
    +----------+
    1 row in set (0.00 sec)