Исходные данные:
Есть переменная $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"
В общем выходif(abs($sum-$control)<0.0001)
{
print 'OK';
}
else
{
print 'Error';
}
Поскольку решилось - допишу еще один - самый красивый выход...
Перед сравнением $sum = round($sum, 1).
>Поскольку решилось - допишу еще один - самый красивый выход...
>Перед сравнением $sum = round($sum, 1).Может и красивый, но в общем случае неверный. Функция round возвращает результат типа float, и мы опять же имеем проблему сравнения вещественных чисел.
>Что не так?Распространённая ошибка: вещественные числа нельзя сравнивать на "равно" и "не равно". Впрочем, вы уже, как я понял, нашли выход в виде оценки модуля разницы сверху достаточно малым числом (которым можно пренебречь) - это наилучший вариант.
>>Что не так?
>
>Распространённая ошибка: вещественные числа нельзя сравнивать на "равно" и "не равно". Впрочем,
>вы уже, как я понял, нашли выход в виде оценки модуля
>разницы сверху достаточно малым числом (которым можно пренебречь) - это наилучший
>вариант.Лучше уж тогда делить одно на другое и смотреть дробную часть результата, вместо того, чтобы отнимать - вот это есть наилучший вариант
С какого перепугу тяжелое деление и выделение дробной части является лучшей альтернативой легкому вычитанию и сравнению? Не говоря уже о проблеме деления на ноль и переполнении.