2013-02-24 5 views
1

Почему это ЛОЖНОЕ условие TRUE?Почему это ЛОЖНОЕ условие TRUE?

<?php 
if(111111111111111119 == 111111111111111118) 
{ 
    echo 'Condition is TRUE!'; 
} 
?> 
+3

Не подтверждено. Может быть, вы имеете в виду без кавычек? –

+0

Вы уверены в этом: http://codepad.viper-7.com/TevroS –

+0

Я могу воспроизвести его: http://codepad.org/sM1LT1nt. –

ответ

3

Цитата:

http://php.net/manual/en/language.operators.comparison.php

$ а == $ Ь ИСТИНА, если $ а равно $ Ь после типа жонглирования

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

Так как ваши строки являются числовыми, они сначала преобразуются в числа. Затем на некоторых архитектурах числа настолько велики, что переполняют максимальный целочисленный размер, и вы получаете равные результаты.

+0

Тип жонглирования не является основной проблемой 'var_dump (111111111111111119 === 111111111111111118);' все равно будет правдой в 32-битной системе – Baba

+0

Они действительно должны добавить сильную типизацию для PHP ... – str

+0

да автор менял вопрос в среднем так, поэтому я не был уверен, в чем вопрос :(Последнее предложение ответа все еще стоит. – fsw

2

РНР DOC

Converting to string

Целое число с плавающей точкой или преобразуется в строку, представляющую число текстуально (включая показатель степени для поплавков). Числа с плавающей запятой могут быть преобразованы с использованием экспоненциальной нотации (4.1E + 6).

Converting to integer

Если поплавок находится за пределами целого числа (обычно +/- 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"); 
    } 
+1

Да, моя система 32 бит. – reza

+0

Они будут преобразованы в float, поэтому '==' и '===' всегда будут true – Baba

0

, поскольку он преобразуется в числовое значение

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! 
Смежные вопросы