Две переменные одинаковы, но не равны. Почему?

12
E2
На сайте с 15.12.2006
Offline
128
#11

Какое-нибудь округление до целого к обоим примените.

Ап! И тигры у ног моих сели.
Pavka
На сайте с 20.05.2005
Offline
82
#12

AlexGM, приведенный Вами код - рабочий. И код takana, выводит единицу:

/ru/forum/comment/5509430

Возможно Вы привели не всю часть скрипта, т.к. ответа:

3.33333333333=3.33333333333-->

3.33333333333=2.33333333333-->
3.33333333333=2-->

этот код выдать не может.

P.S. Для советчиков применить === - в этом случае сравнивается еще и соответствие типам, что в этом случае не нужно, т.к. изначально $a имеет тип float, а $mas_explode строковой 🚬

Без подписи
AG
На сайте с 24.04.2007
Offline
115
#13

Конечно, привел не весь скрипт, только ту часть, где он не работал.

Вот так примерно выглядит та часть от начала и до нерабочего места скрипта (имена переменных от "балды"):


$this->sql_query="SELECT * FROM ..... ..... .....";
$this->sql_execute();

while($r=mysql_fetch_array($this->sql_res))
{
$calc=$r["xu"]/$r["ux"];
$mas_calc[]=$calc;
$mas_id[]=$calc."-".$r["xux"];
}

$kk=max($mas_calc);


foreach($mas_id as $jj)
{
$yu=explode("-", $jj);

if($kk==$yu[0]) { $nn=$yu[1]; }

//echo $kk."=".$yu[0]."-->".$nn."<br>";
}

ps: в принципе я уже нашел рабочий вариант.

pps: код не изящен, конечно, но пишу как умею. Благо, что для себя, никому не продаю :)

T.R.O.N
На сайте с 18.05.2004
Offline
314
#14

AlexGM,

Уважаемый, читайте основы информатики.

Числа с плавающей точкой НЕЛЬЗЯ сравнивать на равенство. Только на больше или меньше!!!

Объясняется просто. Сравниваются не числа а блоки памяти.

Если Вы утверждаете, что в обеих переменных одинаковые значения, сравнивайте на равенство не числа а тексты... if ("3.33333333333" eq "3.33333333333") - для перла. В пыхе что-то типа strcmp()

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
AG
На сайте с 24.04.2007
Offline
115
#15
T.R.O.N:
AlexGM,
Уважаемый, читайте основы информатики.
Числа с плавающей точкой НЕЛЬЗЯ сравнивать на равенство. Только на больше или меньше!!!
Объясняется просто. Сравниваются не числа а блоки памяти.
Если Вы утверждаете, что в обеих переменных одинаковые значения, сравнивайте на равенство не числа а тексты... if ("3.33333333333" eq "3.33333333333") - для перла. В пыхе что-то типа strcmp()

Собственно, я так и делаю сейчас, через strcmp().

Спасибо, буду знать теперь, что нельзя так сравнивать.

S
На сайте с 13.07.2007
Offline
56
#16

Эмммм, ну и замените


{
$mas_id[]=$calc."-".$r["xux"];
}

foreach($mas_id as $jj)
{
$yu=explode("-", $jj);
}

на массив хэшей - быстрее и проще работать будет, нежели то, что есть сейчас.

[Удален]
#17
T.R.O.N:
AlexGM,
Уважаемый, читайте основы информатики.
Числа с плавающей точкой НЕЛЬЗЯ сравнивать на равенство. Только на больше или меньше!!!
Объясняется просто. Сравниваются не числа а блоки памяти.
Если Вы утверждаете, что в обеих переменных одинаковые значения, сравнивайте на равенство не числа а тексты... if ("3.33333333333" eq "3.33333333333") - для перла. В пыхе что-то типа strcmp()

ну если быть совсем точным, то можно, если они заданы именно как числа с плавающей точкой. 1.3241E+13 например

Если равна мантисса и показатель, то числа равны. В некоторых компиляторах при сравнении они приводятся к меньшему по модулю показателю например.

Но в пхп в связи с нестрогой типизацией такой жесткой структуры числа с плавающей точкой нету как таковой. Поэтому 3.333333 это не число с плавающей точкой, будь оно в кавычках или нет. Поэтому прямое сравнение пройдет только если оба значения приведены к одному типу.

т.е. например strval(3.3333333)==mas[0] или floatval(3.3333333)==floatval(mas[0]) - что кстати тоже может не сработать ибо 3.333333 это может быть как 3.3333329 так и 3.3333331 и еще бесконечно много вариантов, вписывающихся в точность float

T.R.O.N
На сайте с 18.05.2004
Offline
314
#18
neolord:
будь оно в кавычках или нет.

в кавычках - оно текст и сравнивается как текст, т.е. побайтно...

neolord:
Поэтому 3.333333 это не число с плавающей точкой

прикольно. а какое? нецелые значения в вычислительной технике имеют только два варианта представления с фиксированной или с плавающей точкой.

neolord:
oatval(3.3333333)==floatval(mas[0]) - что кстати тоже может не сработать

не сработает.

neolord:
Если равна мантисса и показатель, то числа равны.

с точки зрения математики - да. с точки зрения информатики - нет. И, дабы не усложнять жизнь, просто был принят постулат, если числа имеют тип real, float и т.д. - результат сравнение на равно - всегда false. В языках от MS - не предсказуем.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий