Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сравнение переменных с приведением типов.
Форумы портала PHP.SU » PHP » Программирование на PHP » Сравнение переменных с приведением типов.

Страниц (1): [1]
 

1. AngelZP - 01 Сентября, 2009 - 12:32:14 - перейти к сообщению
Исходные данные:
Есть переменная $sum, которая высчитывается путем сложения вычитанных из файла величин. Имеет тип float.
Есть переменная $control, которая вытаскивается из другого файла. Имеет тип string
Суть - сумма величин должна равняться контрольному значению.
Есть код:
PHP:
скопировать код в буфер обмена
  1. var_dump($sum)
  2. var_dump($control);
  3. if ($sum==$control)
  4. {
  5. print 'Ok';
  6. }
  7. else
  8. {
  9. print 'Error'
  10. }


1. При значениях
Цитата:
float(865.4)
string(5) "865.4"

дает ошибку

2. При искусственно указанных значениях для теста

Сравнение проходит нормально с результатом Ок
Цитата:
float(865.4)
string(5) "865.4"


3. Если перед сравнением вставить приведение типа

то все равно дает ошибку
Цитата:
float(865.4)
float(865.4)


4. Если перед сравнением поставить приведение типа
PHP:
скопировать код в буфер обмена
  1. $sum=(string)$sum;

то отрабатывает нормально с результатом ОК

5. Если переменные поменять типами местами
PHP:
скопировать код в буфер обмена
  1. $control=(float)$control;
  2. $sum=(string)$sum;

то все равно отрабатывает абсолютно нормально с результатом ОК

6. Хить сезона
PHP:
скопировать код в буфер обмена
  1. $sum=(float)(string)$sum;

то все равно отрабатывает абсолютно нормально с результатом ОК


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

$sum формируется следующим кодом
PHP:
скопировать код в буфер обмена
  1. while($buf = zip_entry_read($zip_entry,81))
  2. {
  3.       $buf=trim($buf);
  4.       if(strlen($buf)>0)
  5.       {
  6.               $arr=explode(',',$buf);
  7.               $inc=preg_replace('/"/','',$arr[2]);
  8.               $sum=$sum+$inc;
  9.        }
  10. }

Исходная строка
Цитата:
"12345","123","21","12345","76"
"12345","123","21.4","12345","76"
2. Champion - 01 Сентября, 2009 - 12:52:28 - перейти к сообщению
А если перед сравнением $sum = round($sum, 1).
3. AngelZP - 01 Сентября, 2009 - 12:55:06 - перейти к сообщению
Угу.. Все отрабатывает нормально Улыбка

И еще один выход


PHP:
скопировать код в буфер обмена
  1. if(abs($sum-$control)<0.0001)
  2. {
  3.   print 'OK';
  4. }
  5. else
  6. {
  7.   print 'Error';
  8. }

(Добавление)
Правда есть нюанс Улыбка
Поскольку это считаются деньги - нужно округлять до 2-х знаков после запятой Улыбка
4. Champion - 01 Сентября, 2009 - 13:02:10 - перейти к сообщению
AngelZP пишет:
нужно округлять до 2-х знаков после запято
round($sum, 2).
5. AngelZP - 01 Сентября, 2009 - 13:05:29 - перейти к сообщению
Champion пишет:
round($sum, 2).

Пасиба Улыбка Я знаю Улыбка Просто красивое решение искал, как избежать такой проблемы...
6. JustUserR - 02 Сентября, 2009 - 19:17:05 - перейти к сообщению
Цитата:
if(abs($sum-$control)<0.0001)
А почему именно столько? Машинное епсилон гораздо меньше Улыбка
7. Champion - 03 Сентября, 2009 - 08:44:28 - перейти к сообщению
JustUserR, автор же говорил, что ему до второго знака даже достаточно) Ну и перестраховка чуть-чуть.
8. Nestor - 03 Сентября, 2009 - 16:55:59 - перейти к сообщению
floatval()

 

Powered by ExBB FM 1.0 RC1