The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Сравнение переменных в PHP с приведением типов."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы WEB технологии (Public)
Изначальное сообщение [ Отслеживать ]

"Сравнение переменных в PHP с приведением типов."  +/
Сообщение от AngelZP (ok) on 01-Сен-09, 13:05 
Исходные данные:
Есть переменная $sum, которая высчитывается путем сложения вычитанных из файла величин. Имеет тип float.
Есть переменная $control, которая вытаскивается из другого файла. Имеет тип string
Суть - сумма величин должна равняться контрольному значению.
Есть код:
var_dump($sum)
var_dump($control);
if ($sum==$control)
{
print 'Ok';
}
else
{
print 'Error'
}

1. При значениях
float(865.4)
string(5) "865.4"
дает ошибку

2. При искусственно указанных значениях для теста
$sum=865.4;
$control='865.4';
Сравнение проходит нормально с результатом Ок
float(865.4)
string(5) "865.4"

3. Если перед сравнением вставить приведение типа
$control=(float)$control;
то все равно дает ошибку
float(865.4)
float(865.4)

4. Если перед сравнением поставить приведение типа
$sum=(string)$sum;
то отрабатывает нормально с результатом ОК

5. Если переменные поменять типами местами
$control=(float)$control;
$sum=(string)$sum;
то все равно отрабатывает абсолютно нормально с результатом ОК

6. Хить сезона
$sum=(float)(string)$sum;
то все равно отрабатывает абсолютно нормально с результатом ОК


Грабли в виде хранения $sum.Что не так?

$sum формируется следующим кодом
while($buf = zip_entry_read($zip_entry,81))
{
      $buf=trim($buf);
      if(strlen($buf)>0)
      {
              $arr=explode(',',$buf);
              $inc=preg_replace('/"/','',$arr[2]);
              $sum=$sum+$inc;
       }
}
Исходная строка
"12345","123","21","12345","76"
"12345","123","21.4","12345","76"

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Сравнение переменных в PHP с приведением типов."  +/
Сообщение от AngelZP (ok) on 01-Сен-09, 13:52 
В общем выход

if(abs($sum-$control)<0.0001)
{
  print 'OK';
}
else
{
  print 'Error';
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Сравнение переменных в PHP с приведением типов."  +/
Сообщение от AngelZP (ok) on 01-Сен-09, 14:07 
Поскольку решилось - допишу еще один - самый красивый выход...
Перед сравнением $sum = round($sum, 1).
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Сравнение переменных в PHP с приведением типов."  +/
Сообщение от XAnder (ok) on 01-Сен-09, 15:13 
>Поскольку решилось - допишу еще один - самый красивый выход...
>Перед сравнением $sum = round($sum, 1).

Может и красивый, но в общем случае неверный. Функция round возвращает результат типа float, и мы опять же имеем проблему сравнения вещественных чисел.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Сравнение переменных в PHP с приведением типов."  +/
Сообщение от XAnder (ok) on 01-Сен-09, 15:07 
>Что не так?

Распространённая ошибка: вещественные числа нельзя сравнивать на "равно" и "не равно". Впрочем, вы уже, как я понял, нашли выход в виде оценки модуля разницы сверху достаточно малым числом (которым можно пренебречь) - это наилучший вариант.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Сравнение переменных в PHP с приведением типов."  +/
Сообщение от tabletrtd (ok) on 19-Сен-09, 15:19 
>>Что не так?
>
>Распространённая ошибка: вещественные числа нельзя сравнивать на "равно" и "не равно". Впрочем,
>вы уже, как я понял, нашли выход в виде оценки модуля
>разницы сверху достаточно малым числом (которым можно пренебречь) - это наилучший
>вариант.

Лучше уж тогда делить одно на другое и смотреть дробную часть результата, вместо того, чтобы отнимать - вот это есть наилучший вариант

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Сравнение переменных в PHP с приведением типов."  +/
Сообщение от angra (ok) on 20-Сен-09, 12:45 
С какого перепугу тяжелое деление и выделение дробной части является лучшей альтернативой легкому вычитанию и сравнению? Не говоря уже о проблеме деления на ноль и переполнении.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру