2013-02-24 176 views
1

爲什麼這個FALSE條件爲TRUE?爲什麼這個FALSE條件是TRUE?

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

未確認。可能是你的意思沒有引號? – 2013-02-24 17:43:05

+0

您確定關於此問題:http://codepad.viper-7.com/TevroS – 2013-02-24 17:43:56

+0

我可以重現它:http://codepad.org/sM1LT1nt。 – 2013-02-24 17:45:32

回答

3

引用自:

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

$ A == $ b爲TRUE,如果$ a等於$ b型雜耍

後,如果您比較了一些有一個字符串或比較涉及的數字字符串,然後將每個字符串轉換爲一個數字,並進行數值比較

因此,因爲你的字符串都是數字,他們首先被轉換爲數字。 然後,在某些體系結構中,數字非常大,並且溢出了最大整數大小,您將得到相同的結果。

+0

類型雜耍不是主要問題'var_dump(111111111111111119 === 111111111111111118);'在32位系統上依然如此 – Baba 2013-02-24 17:54:15

+0

他們確實應該給PHP增加強大的打字...... – str 2013-02-24 17:55:27

+0

是作者在同一時間改變了問題所以我不知道這個問題究竟是什麼問題:(答案的最後一句仍然存在) – fsw 2013-02-24 17:55:51

2

PHP DOC

Converting to string

一個整數或浮點數轉換爲代表數字文本方式(包括指數部分爲浮子)的字符串。浮點數可以使用指數表示法(4.1E + 6)進行轉換。

Converting to integer

如果浮子超出整數的邊界(通常爲+/- 2.15e + 9 = 2^31在32位的平臺和+/- 9.22e + 18 = 2^64在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 2013-02-24 17:55:14

+0

它們會被轉換爲浮點數,所以'=='和'==='將永遠是真的 – Baba 2013-02-24 17:55:56

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上的報價它顯示錯誤。

if('a111111111111111119' == 'a111111111111111118') 
{ 
echo 'Condition is TRUE!'; 
} else { 
echo 'Condition is FALSE!'; 
} 
// condition is FALSE! 
相關問題