Быстрый простой вопрос:
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, если они оба выглядят как числа, даже если они уже являются нитями
Эта ошибка обсуждается здесь