Проблем при сравнение на числа с плаваща запетая при MySQL
Докато работих по един клиентски проблем се оказа, че има проблем при „сравнение“ на числата с плаваща запетая поне при MySQL. Може и да не е проблем, но някои хора може да се сблъскат с този проблем.
Да кажем, че искате да направите сайт за аукциони и искате да има графа „аукциони от 1 стотинка“. Това означава, че искате да вземете всички аукциони, които имат начална цена 0.01.
Обикновено вие (както и аз) бихте направили това:
SELECT * FROM auctions WHERE auction_start_price=0.01
Далеч не ви препоръчвам да си пишете така заявките, но това е друг въпрос. Реално няма да има никакви резултати дори в auctions.auction_start_price да има 0.01 в някои от редовете. Затова ще променим заявката така:
SELECT * FROM auctions WHERE ROUND(auction_start_price,2)=0.01
Сега всичко ще е наред. Друго решение е просто да посочите, че auction_start_price<0.02 и всичко щеше да е ок, но в някои случаи, ще е по-добър вариант закръглянето
Related posts:
Така, така – почти си стигнал до извода, че за цени трябва да се използва DECIMAL, а не FLOAT/DOUBLE!
При FLOAT/DOUBLE винаги има толеранс. Проблемът не е само в MySQL, а навсякъде където има „плаваща запетая“. Числата винаги се записват с някакво закръгление. Например нещо като „ти записваш 1.4, а то се оказва 0.3999999999999986.
Правилното сравнение в твоя случай е следното:
SELECT *
FROM auctions
WHERE ABS(auction_start_price-0.01)<0.0001
Където 0.0001 е избрания от теб толеранс.
Да, да
трябва да се използва ABS