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

Форум Apache

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

 

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

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

тема: Мир MYSQL + PHP перевернулся
 
 автор: pavluxa09   (18.07.2011 в 10:28)   письмо автору
 
 

Добрый день. У меня есть таблица MyTable с двумя полями LastSumBet (DECIMAL 11,2) и SumStepBet (DECIMAL 11,2). В таблице всего одна строку, у которые значения полей соответствуют: 0.56 и 0.05.
При помощи класса PDO мы получаем массив из этих двух значений.
Далее пишу вот такое:

echo ($sqlResult['LastSumBet'] + $sqlResult['SumStepBet']) > 0.61;


А ОНО ВОЗВРАЩАЕТ TRUE! Я в шоке... Всё нормик, но если ($sqlResult['LastSumBet'] + $sqlResult['SumStepBet']) == 0.61 то FALSE!

Я уже и к float приводил безполезно (( Что за хрень?

А что самое интересное, то что оно работает нормально только с некоторыми значениями полей.

  Ответить  
 
 автор: pavluxa09   (18.07.2011 в 10:42)   письмо автору
 
   для: pavluxa09   (18.07.2011 в 10:28)
 

После долгих тестирований нашел ещё хрень,
Если $sqlResult['LastSumBet'] + $sqlResult['SumStepBet'] например равно 0.09
При попытке сделать $sqlResult['LastSumBet'] + $sqlResult['SumStepBet'] - 0.01 результат 0.08
А при попытке отнять тоже самое число, т.е $sqlResult['LastSumBet'] + $sqlResult['SumStepBet'] - 0.09 результатом является 1.38777878078e-17 . Что это такое за фигня?

  Ответить  
 
 автор: cheops   (18.07.2011 в 12:19)   письмо автору
 
   для: pavluxa09   (18.07.2011 в 10:42)
 

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

  Ответить  
 
 автор: pavluxa09   (18.07.2011 в 19:12)   письмо автору
 
   для: cheops   (18.07.2011 в 12:19)
 

Понял, спасибо!

  Ответить  
 
 автор: pavluxa09   (13.06.2012 в 10:29)   письмо автору
 
   для: pavluxa09   (18.07.2011 в 19:12)
 

А как с этим бороться?

  Ответить  
 
 автор: cheops   (13.06.2012 в 22:19)   письмо автору
 
   для: pavluxa09   (13.06.2012 в 10:29)
 

По-разному можно, однако, в PHP есть удобная функция round() при помощи которой можно округлять результаты в том числе и до определенного знака после запятой.

  Ответить  
Rambler's Top100
вверх

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