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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сравнение переменных с приведением типов.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Хит сезона в багах...
AngelZP
Отправлено: 01 Сентября, 2009 - 12:32:14
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2009  
Откуда: Запорожье,Украина


Помог: 0 раз(а)




Исходные данные:
Есть переменная $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. Если перед сравнением поставить приведение типа

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

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

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

6. Хить сезона

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


Грабли в виде хранения $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"
 
 Top
Champion Супермодератор
Отправлено: 01 Сентября, 2009 - 12:52:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




А если перед сравнением $sum = round($sum, 1).
 
 Top
AngelZP
Отправлено: 01 Сентября, 2009 - 12:55:06
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2009  
Откуда: Запорожье,Украина


Помог: 0 раз(а)




Угу.. Все отрабатывает нормально Улыбка

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


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

(Добавление)
Правда есть нюанс Улыбка
Поскольку это считаются деньги - нужно округлять до 2-х знаков после запятой Улыбка
 
 Top
Champion Супермодератор
Отправлено: 01 Сентября, 2009 - 13:02:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




AngelZP пишет:
нужно округлять до 2-х знаков после запято
round($sum, 2).
 
 Top
AngelZP
Отправлено: 01 Сентября, 2009 - 13:05:29
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Сент. 2009  
Откуда: Запорожье,Украина


Помог: 0 раз(а)




Champion пишет:
round($sum, 2).

Пасиба Улыбка Я знаю Улыбка Просто красивое решение искал, как избежать такой проблемы...
 
 Top
JustUserR
Отправлено: 02 Сентября, 2009 - 19:17:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Цитата:
if(abs($sum-$control)<0.0001)
А почему именно столько? Машинное епсилон гораздо меньше Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Champion Супермодератор
Отправлено: 03 Сентября, 2009 - 08:44:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




JustUserR, автор же говорил, что ему до второго знака даже достаточно) Ну и перестраховка чуть-чуть.
 
 Top
Nestor
Отправлено: 03 Сентября, 2009 - 16:55:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 220
Дата рег-ции: Март 2009  


Помог: 0 раз(а)






-----
Aurus CMS
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB