Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: не всегда работает оператор between на типе float ?
 
 автор: mike_z   (08.04.2007 в 17:52)   письмо автору
 
 

Есть таблица 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
Это всегда так было?

   
 
 автор: Trianon   (08.04.2007 в 19:16)   письмо автору
 
   для: mike_z   (08.04.2007 в 17:52)
 

Числа с плавающей точкой хранятся в двоичной системе счисления.
Десятичное число 0.07 в двоичной системе представимо лишь приближенно. Вы столкнулись с ошибкой округления.

   
 
 автор: mike_z   (09.04.2007 в 14:14)   письмо автору
 
   для: Trianon   (08.04.2007 в 19:16)
 

Тогда mysql это один из немногих софтов (возможно единственный) выдающих данную ошибку.
В этом случае все компы оказались бы давно на помойке (если бы влияло округление).
Дестичные цифры представляются в виде целого числа и мантиссы и на такой разрядности для такой мелкой цифры ни о каком округлении и речи быть не может.

   
 
 автор: mike_z   (09.04.2007 в 14:43)   письмо автору
 
   для: 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:57)   письмо автору
 
   для: mike_z   (09.04.2007 в 14:43)
 

http://www.mysql.ru/docs/man/No_matching_rows.html

   
 
 автор: Trianon   (09.04.2007 в 15:08)   письмо автору
 
   для: mike_z   (09.04.2007 в 14:14)
 

Число 0.07 представляется приближенно просто всилу того, что дробь 7/100 точно в двоичной системе не записать.
Точно также Вы не представите точно 0.7, хотя тут, казалось бы, всего один знак.



http://www.mysql.ru/docs/man/Problems_with_float.html

   
 
 автор: mike_z   (09.04.2007 в 21:25)   письмо автору
 
   для: Trianon   (09.04.2007 в 15:08)
 

Спасибо, чтобы не менять код перевел все данные на decimal

   
 
 автор: Trianon   (09.04.2007 в 21:39)   письмо автору
 
   для: mike_z   (09.04.2007 в 21:25)
 

Возможно это оптимальный вариант.
Еще существует тип MONEY

   
 
 автор: cheops   (10.04.2007 в 00:17)   письмо автору
 
   для: Trianon   (09.04.2007 в 21:39)
 

>Еще существует тип MONEY
В MySQL его нет, здесь всегда при помощи DECIMAL с деньгами приходиться работать.

   
 
 автор: Trianon   (10.04.2007 в 09:41)   письмо автору
 
   для: cheops   (10.04.2007 в 00:17)
 

С mssql перепутал. Значит не MONEY, а NUMERIC

   
 
 автор: cheops   (10.04.2007 в 12:44)   письмо автору
 
   для: Trianon   (10.04.2007 в 09:41)
 

А NUMERIC в MySQL полный синоним DECIMAL... В MySQL действительно ничего лучше DECIMAL нет, да в принципе и не нужно наверное...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования