Почему это ЛОЖНОЕ условие TRUE?Почему это ЛОЖНОЕ условие TRUE?
<?php
if(111111111111111119 == 111111111111111118)
{
echo 'Condition is TRUE!';
}
?>
Почему это ЛОЖНОЕ условие TRUE?Почему это ЛОЖНОЕ условие TRUE?
<?php
if(111111111111111119 == 111111111111111118)
{
echo 'Condition is TRUE!';
}
?>
Цитата:
http://php.net/manual/en/language.operators.comparison.php
$ а == $ Ь ИСТИНА, если $ а равно $ Ь после типа жонглирования
Если сравнить число с строка или сравнение включают в себя числовые строки, затем каждая строка преобразуется в число и выполняется сравнение численно
Так как ваши строки являются числовыми, они сначала преобразуются в числа. Затем на некоторых архитектурах числа настолько велики, что переполняют максимальный целочисленный размер, и вы получаете равные результаты.
Тип жонглирования не является основной проблемой 'var_dump (111111111111111119 === 111111111111111118);' все равно будет правдой в 32-битной системе – Baba
Они действительно должны добавить сильную типизацию для PHP ... – str
да автор менял вопрос в среднем так, поэтому я не был уверен, в чем вопрос :(Последнее предложение ответа все еще стоит. – fsw
РНР DOC
Целое число с плавающей точкой или преобразуется в строку, представляющую число текстуально (включая показатель степени для поплавков). Числа с плавающей запятой могут быть преобразованы с использованием экспоненциальной нотации (4.1E + 6).
Если поплавок находится за пределами целого числа (обычно +/- 2.15e + 9 = 2^31 на 32-битных платформах и +/- 9.22e + 18 = 2^63 на 64-битных платформах), результат не определен, так как float не имеет достаточной точности для получения точного целочисленного результата. Никакого предупреждения, даже уведомление не будет опубликовано, когда это произойдет!
Моя догадка вы используете систему на 32 бита поэтому поэтому
var_dump(111111111111111119,111111111111111118);
var_dump(111111111111111119 === 111111111111111118); // would be true on 32bit
Выход
float 1.1111111111111E+17
float 1.1111111111111E+17
true
Простое решение
if(bcsub("111111111111111119", "111111111111111118") == "0")
{
// 32 bit true
var_dump("Am Free");
}
, поскольку он преобразуется в числовое значение
if('111111111111111119' == '111111111111111118')
{
echo 'Condition is TRUE!';
} else {
echo 'Condition is FALSE!';
}
// on 64 bit: condition is FALSE! (tested on my mac)
Я бы предположил, что на 32-битной машине это будет правда. Даже когда я удаляю кавычки на моем mac, он показывает false.
if('a111111111111111119' == 'a111111111111111118')
{
echo 'Condition is TRUE!';
} else {
echo 'Condition is FALSE!';
}
// condition is FALSE!
Не подтверждено. Может быть, вы имеете в виду без кавычек? –
Вы уверены в этом: http://codepad.viper-7.com/TevroS –
Я могу воспроизвести его: http://codepad.org/sM1LT1nt. –