Intereting Posts
Как вызвать метод обратного вызова для класса? Функциональный тестовый сервер Symfony2 с параметром SERVER_NAME codeigniter: передать массив из контроллера для просмотра Laravel 5.3 – уведомления и субнотики с разбивкой по страницам один раз? Как я могу загрузить доступ к файлам вне каталога public_html? Как получить данные конфигурации в laravel в подпапке Использование php для экспорта запроса mysql в загружаемый CSV-файл Неопределенная константа класса 'MYSQL_ATTR_INIT_COMMAND' в константе неопределенного класса (PHP 5.5.3) как отправлять встроенные изображения в электронную почту, используя php и html Получить все результаты из базы данных с помощью mysqli Лучший редактор PHP для Vista значения переменных boolean в PHP для реализации javascript Какие функции PHP создают выходные данные? Стропы с точными совпадениями Как добавить динамическое текстовое поле (строка) и сохранить в базу данных с помощью PHP

Длинные номера php в сравнении строк

Быстрый простой вопрос:

var_dump("555555555555555555555" == "555555555555555555553"); //bool(true) var_dump("aaaaaaaaaaaaaaaaaaaaa" == "aaaaaaaaaaaaaaaaaaaab"); //bool(false) 

Почему это происходит?

Я знаю, что могу использовать

 var_dump(strcmp("555555555555555555555", "555555555555555555553") == 0); //bool(false) 

Но почему первая строка возвращает true?

Это побочный эффект принуждения типа. Есть статья о phpsadness об этом. В принципе, строки сравнения сравниваются с числовыми типами и из-за потери точности кажутся равными.

В первом ряду

 var_dump("555555555555555555555" == "555555555555555555553"); 

это правда

Почему, потому что операторы сравнения типа принуждения будут принуждать оба операнда к float, если они оба выглядят как числа, даже если они уже являются нитями

Эта ошибка обсуждается здесь