|
|
|
| Добрый день. У меня есть таблица 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:28)
| | После долгих тестирований нашел ещё хрень,
Если $sqlResult['LastSumBet'] + $sqlResult['SumStepBet'] например равно 0.09
При попытке сделать $sqlResult['LastSumBet'] + $sqlResult['SumStepBet'] - 0.01 результат 0.08
А при попытке отнять тоже самое число, т.е $sqlResult['LastSumBet'] + $sqlResult['SumStepBet'] - 0.09 результатом является 1.38777878078e-17 . Что это такое за фигня? | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2011 в 10:42)
| | Эта фигня с 1950-х годов длиться и будет длиться еще столько же, называется накопление ошибки вычисления, всегда так с FLOAT во всех языках программирования. Дело в том, что числа с плавающей точкой представлены не точно (на это нужно слишком много памяти), а моделью. Чем больше вычислений с FLOAT вы производите - тем больше накапливается ошибка. DECIMAL, как раз для того и изобрели, чтобы избегать таких вещей. Вот если вы вычисления и сравнения произведете внутри MySQL - все будет нормально. Т.е. вот этот хвостик в конце (как в плюс, так и в минус) нужно иметь в виду, особенно при сравнении чисел с плавающей точкой. | |
|
|
|
|
|
|
|
для: cheops
(18.07.2011 в 12:19)
| | Понял, спасибо! | |
|
|
|
|
|
|
|
для: pavluxa09
(18.07.2011 в 19:12)
| | А как с этим бороться? | |
|
|
|
|
|
|
|
для: pavluxa09
(13.06.2012 в 10:29)
| | По-разному можно, однако, в PHP есть удобная функция round() при помощи которой можно округлять результаты в том числе и до определенного знака после запятой. | |
|
|
|