|
|
|
| Есть таблица FLOATS с 2-я столбцами
id INTEGER (autoincrement)
f1 FLOAT
Если в записи значение столбца f1 задать 0.07
то запрос
select * from FLOATS where f1 BETWEEN 0.04 and 0.07
НИЧЕГО не вернет
select * from FLOATS where f1 between 0.04 and 0.071
вернте данную запись.
Причетм результат (по опытам) зависит от числа и от того попадает ли
искомое значение в верхнюю или нижнюю границу.
Проверил на MySQL 4.1 и 5.03
Это всегда так было? | |
|
|
|
|
|
|
|
для: mike_z
(08.04.2007 в 17:52)
| | Числа с плавающей точкой хранятся в двоичной системе счисления.
Десятичное число 0.07 в двоичной системе представимо лишь приближенно. Вы столкнулись с ошибкой округления. | |
|
|
|
|
|
|
|
для: Trianon
(08.04.2007 в 19:16)
| | Тогда mysql это один из немногих софтов (возможно единственный) выдающих данную ошибку.
В этом случае все компы оказались бы давно на помойке (если бы влияло округление).
Дестичные цифры представляются в виде целого числа и мантиссы и на такой разрядности для такой мелкой цифры ни о каком округлении и речи быть не может. | |
|
|
|
|
|
|
|
для: mike_z
(09.04.2007 в 14:14)
| | Хотя судя по этой статье
http://dev.mysql.com/doc/refman/5.0/en/precision-math-examples.html
например, 0.0001 сложенное 10000 раз само с собой будет = 0.99999999999991 вместо единицы. | |
|
|
|
|
|
|
|
для: mike_z
(09.04.2007 в 14:43)
| | http://www.mysql.ru/docs/man/No_matching_rows.html | |
|
|
|
|
|
|
|
для: mike_z
(09.04.2007 в 14:14)
| | Число 0.07 представляется приближенно просто всилу того, что дробь 7/100 точно в двоичной системе не записать.
Точно также Вы не представите точно 0.7, хотя тут, казалось бы, всего один знак.
http://www.mysql.ru/docs/man/Problems_with_float.html | |
|
|
|
|
|
|
|
для: Trianon
(09.04.2007 в 15:08)
| | Спасибо, чтобы не менять код перевел все данные на decimal | |
|
|
|
|
|
|
|
для: mike_z
(09.04.2007 в 21:25)
| | Возможно это оптимальный вариант.
Еще существует тип MONEY | |
|
|
|
|
|
|
|
для: Trianon
(09.04.2007 в 21:39)
| | >Еще существует тип MONEY
В MySQL его нет, здесь всегда при помощи DECIMAL с деньгами приходиться работать. | |
|
|
|
|
|
|
|
для: cheops
(10.04.2007 в 00:17)
| | С mssql перепутал. Значит не MONEY, а NUMERIC | |
|
|
|
|
|
|
|
для: Trianon
(10.04.2007 в 09:41)
| | А NUMERIC в MySQL полный синоним DECIMAL... В MySQL действительно ничего лучше DECIMAL нет, да в принципе и не нужно наверное... | |
|
|
|