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 ★★★★★ ()
Ответ на: комментарий от AEP

Раньше-то работало :-)

Вопрос: как в данном случае правильно выборку делать?

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

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

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

select float_field3 from table1 where float_field1 = 0.3;

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

> Раньше-то работало :-)

Это был баг.

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

Спасибо. Придется переделать на целые числа, вместо 0.2 — 200

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

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

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

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