Приведение типов

NeoLynx

Новичок
Приведение типов

$a="359.71";

$db = mysql_query("SELECT * FROM `$table` WHERE id='$id'");

WHILE ($check = mysql_fetch_array($db)){
$box += $check[cont];
$free_box += $check[freecont];
}

if($a!=$box){ echo 1;}
if($a!==$free_box){ echo 1;}

echo $a."<br>";
echo $box."<br>";
echo $free_box."<br>";

Ответ скрипта:
1
1
359.71
359.71
359.71


Я понимаю что похоже это из-за разности типов, но не пойму как правильно привести всё к одному типу, все переменные хранятся в базе как varchar.
 

IL78

Guest
Может, в данном случае лучше вместо += использовать .= ?
 

NeoLynx

Новичок
нужно именно склаывать несколько $check[cont], и сравнивать их с начальной переменной $a.
 

Фанат

oncle terrible
Команда форума
при отладке ВСЕГДА вместо эха используй var_dump()
молжет быть, это натолкнет тебя на мысль.

-~{}~ 10.06.04 01:44:

нужно именно склаывать несколько
обычно, поле id в датабазе является УНИКАЛЬНЫМ индексом.
и щапрос вида WHERE id='$id' несколько строк не вернет.
 

NeoLynx

Новичок
Спасибо большое, натолкнуло, вроде решилось.
Вопрос был именно в приведении типов.
 

Фанат

oncle terrible
Команда форума
вопрос был в том, что ты зачем-то объявил число, как строку, а потом стал сравнивать с ней числа
 

NeoLynx

Новичок
Именно, только данные брались из базы, это я в примере написал $a=... для простоты восприятия, так сказать.

var_dump() всё расставил на свои места.
 

Фанат

oncle terrible
Команда форума
может, прямо в запросе сравнивать?
может, не варчар использовать, а тот тип, к которому, данные, собственно, относятся, а?
 

NeoLynx

Новичок
в запросе не получится, $а берется из одной таблицы, а $check складывается из нескольких записей в другой.

А вот хранить во float это разумно, но лениво сейчас всё переписывать, может позже руки дойдут ;)
 

Фанат

oncle terrible
Команда форума
хранить во float - неразумно
хранить надо в decimal
лениво сейчас всё переписывать,
одна строчка альтер табле - это у вас, у молодежи, назвается "все переписывать"?

в запросе не получится, $а берется из одной таблицы, а $check складывается из нескольких записей в другой
язык SQL умеет и складывать и сравнивать значения из разных таблиц
 

NeoLynx

Новичок
одна строчка альтер табле - это у вас, у молодежи, назвается "все переписывать"?
Да

язык SQL умеет и складывать и сравнивать значения из разных таблиц
Знание свет, полезу читать.

-~{}~ 30.06.04 18:29:

косвенно в продолжение это темы, похожий скрипт выдает, что

string(6) "111.01"

не равно

string(5) "61.01" + string(1) "0" + string(2) "50"

это var_dump слогаемых переменных
никак не пойму почему...
 

Фанат

oncle terrible
Команда форума
а при чем здесь "слогаемые" переменные?
а дамп СРАВНИВАЕМЫХ что выдает?
 

NeoLynx

Новичок
я другое имел ввиду

выглядит это как:

if (($info[add])!=($info[free]+$info[reserv]+$info[sell])){
echo"бла бла";
}

php говорит, что не равны.
почему?
 

SiMM

Новичок
PHP:
echo 61.01+50;
if (111.01 != 61.01+50) echo ' no ok';
NeoLynx, вы вообще знакомы с машинной арифметикой? О погрешности вычислений когда-нибудь что-либо слышали? О невозможности преобразовать некоторые конечные десятичные дроби в конечный двоичный эквивалент? Так вот - это всё из этой оперы.
 

Фанат

oncle terrible
Команда форума
php говорит, что не равны.
почему?
ответ
на
этот
вопрос
даст
дамп
сравниваемых
переменных

ну неужели непонятно, что надо получить сумму в переменную и вывести дамп?
 

SiMM

Новичок
Фанат, дело не в этом. Выше я привёл неудачный пример - более удачным, думаю, будет следующий:
PHP:
echo 111.01-(61.01+50)
Результат - 1.4210854715202E-014 - очевидно, что он не равен нулю.
NeoLynx, если вы этого не знали - это не смешно.
PS: до кучи, писать надо $info['add'], а не $info[add].
 

noLame

Guest
Может проще ответить? Я сам столкнулся с такой проблемой - ошибку правда я сам нашел и понял, но как обойти?
Точнее как привести переменные к одному типу... is_type не катит:(
 
Сверху