LINUX.ORG.RU

[mysql] изменилось поведение BETWEEN после апгрейда?

 


0

0

Привожу минимальный вариант (раньше все работало)

 id     float_field1    float_field2    float_field3    
 1          0.3           9999             10 
 2          0.20001       0.29999          20
 3          0.2           0.2              30
 4          0.10001       0.19999          40
 5          0.1           0.1              50
 6          0.05          0.09999          60

Теперь запрос

SELECT float_field3 FROM table1 WHERE 0.3 BETWEEN float_field1 AND float_field2;
Не находит 10 из строки id=1

Вобщем для любого запроса с WHERE ? равным значению float_field1 возвращается пустой результат. А ведь BETWEEN работает <= =>, т.е. включая граничные условия.

mysql Ver 14.14 Distrib 5.1.48,

★★★★★

Не сравнивай float'ы на строгое равенство. Из-за ошибок округления при переводе из двоичной системы в десятичную и обратно результат никогда не был надежно определен.

AEP ★★★★★
()
Ответ на: комментарий от sdio

Переформулировать задачу, чтобы точное равенство для float'ов никогда не играло роль. В самом простом случае - добавлять и вычитать машую величину epsilon.

Hint: вот такой запрос у тебя тоже дает пустоту:

select float_field3 from table1 where float_field1 = 0.3;

AEP ★★★★★
()
Ответ на: комментарий от sdio

> Придется переделать на целые числа

Да, это самое надежное, если работает. Если на самом деле нужна арифметика с фиксированным числом знаков после запятой, трудно переводимая в целочисленную (такое бывает для кросс-курсов валют), то можно попробовать decimal(x, y).

AEP ★★★★★
()
Ответ на: комментарий от AEP

Уже переделал. Работает.

sdio ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.