URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 6492
[ Назад ]

Исходное сообщение
"Сравнение переменных в PHP с приведением типов."

Отправлено AngelZP , 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"


Содержание

Сообщения в этом обсуждении
"Сравнение переменных в PHP с приведением типов."
Отправлено AngelZP , 01-Сен-09 13:52 
В общем выход

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


"Сравнение переменных в PHP с приведением типов."
Отправлено AngelZP , 01-Сен-09 14:07 
Поскольку решилось - допишу еще один - самый красивый выход...
Перед сравнением $sum = round($sum, 1).

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

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


"Сравнение переменных в PHP с приведением типов."
Отправлено XAnder , 01-Сен-09 15:07 
>Что не так?

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


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

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


"Сравнение переменных в PHP с приведением типов."
Отправлено angra , 20-Сен-09 12:45 
С какого перепугу тяжелое деление и выделение дробной части является лучшей альтернативой легкому вычитанию и сравнению? Не говоря уже о проблеме деления на ноль и переполнении.