PHP читает значение 1.10 как 1.1 (0 в конце переменной не учитывается) - PullRequest
1 голос
/ 22 марта 2010

Мне сложно это сказать, но мне легче продемонстрировать:

У меня есть опция выбора:

<option <?php if($frequency[$key]=='1.10'){echo "selected";}?> value='1.10'>1 every 10 days</option>

Действительно, частота $ [$ key] = 1.1; , но выше все равно отображается выбранным. Я никогда не видел этого раньше и не знал, что это может произойти. Есть идеи как это предотвратить?

Работа с php5. Спасибо, Хадсон

Ответы [ 4 ]

6 голосов
/ 22 марта 2010

Это потому, что PHP так сильно любит числа, что если любая из сторон сравнения выглядит как число, попытается сделать оба операнда числами . Это означает, что ваша строка преобразуется в число с плавающей точкой, и, действительно, становится 1.1.

Чтобы сравнить строки и убедиться, что они сравниваются как строки, либо используйте === (при условии, что ваш другой операнд также является строкой), либо используйте strcmp.

if ($frenquency[$key] === '1.10')
if (strcmp($frenquency[$key], '1.10') == 0)

Для получения дополнительной информации см. Руководство PHP по операторам сравнения , раздел страницы "Сравнение с различными типами".

2 голосов
/ 22 марта 2010

Вам нужно использовать компаратор идентичности ===, а не компаратор равенства ==.

$f = 1.1;
$s = '1.10';

$s == $f;  // true
$s === $f; // false

Или вы можете сделать явное сравнение строк:

strcmp($s, $f);  // int(-1) -- they are not equal
0 голосов
/ 22 марта 2010

Руководство имеет тенденцию быть довольно резким, когда дело доходит до сравнения поплавков. Вы должны сравнивать их как строку, если вы хотите различить 1.1 и 1.10.

0 голосов
/ 22 марта 2010

Просто идея, но попробуйте "===" вместо "==" при выполнении сравнения и поместите двойные кавычки около 1,10, чтобы принудительно ввести тип в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...