Сравнение разных строк в PHP с ==возвращает true


Я просто отлаживал сценарий и обнаружил, что оператор if работает не так, как я ожидал.

var_dump("6064365413078728979" == "6064365413078728452");
die();

Приведенный выше код приведет к следующему:

bool(true)

С оператором === он работает так, как ожидалось. У кого-нибудь есть какие-нибудь идеи, почему?

Я использую PHP версии 5.3.13 с установкой wamp на 64-разрядной машине с Windows.

Author: Lubje, 2013-01-10

2 answers

<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>

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

Вот почему, когда оба сравниваются численно, они равны. Следовательно, используйте === как предлагали другие

Редактировать: Объяснение, основанное на совете @Axel.

Руководство по PHP объясняет

Размер поплавок зависит от платформы, хотя максимум ~1.8e308 с точностью примерно до 14 десятичных цифр является общим значением (64-разрядный формат IEEE).

И этот веб-сайт предлагает и объясняет явление переполнения, а также небольшой php-код для проверки целочисленного и плавающего диапазона вашей системы. Знакомство с ограничением на ваших серверах, скорее всего, лучше всего объяснит, почему произошел поток предложений

 3
Author: Hanky Panky, 2015-03-09 05:13:11

PHP имеет поведение сравнения свободных типов, поэтому ваши числовые строки преобразуются в целочисленные типы перед == нестрогим сравнением, и результат преобразования переполняется.

Это основная причина использовать ===, когда это возможно.

Взгляните на эту страницу для получения дополнительной информации о жонглировании типами.

 7
Author: Áxel Costas Pena, 2013-01-10 18:10:33