2012-08-22 86 views
2

我有問題,此代碼:PHP模返回錯誤的結果

if (!empty($_GET[ "lic" ])) $lic = $_GET[ "lic" ]; else $e = true; 
echo ($lic % 11); 

當我發佈8911076856呼應1,但它應該是0

+4

可能是因爲'8911076856'對於int而言太高了,而且溢出了? – andrewsi

+0

我認爲這不是問題'var_dump(8911076856%11);'returns'int(0)'。在回調模之前調用'var_dump($ lic)'。 – Florent

+1

@Florent - 就是這個問題。這是一個32位系統,他試圖處理太大的值以適應4字節的整數。您可能在64位系統上進行測試。 –

回答

5

使用fmod

echo fmod(8911076856, 11); 
+0

+1。出於好奇,'fmod()'超過'(float)$ x%(float)$ y'只是結果的精確度? – FtDRbwLXw6

+0

不,'(float)$ x%(float)$ y'不能爲PHP_INT_MAX以上的$ x值給出正確的結果。例如。 '(float)8911076856%(float)10'給出4而不是6.顯然,模運算符將這兩個參數都轉換回int。 – Sjoerd

+0

啊,很高興知道!謝謝。 – FtDRbwLXw6

9

值「8911076856」可能高於系統的最大整數值。

echo ((int)8911076856); 

我的32位系統的結果是321142264。

+0

這是正確的,我得到了正確的結果('0') 64位系統 – Touki

+0

在這種情況下,PHP會自動將該數字轉換爲浮點數。顯然,模運算符在浮點上不能正確運行。 – Sjoerd

2

這很可能是因爲您發佈的數量高於PHP_INT_MAX,這是大多數64位系統AFAIK上的9223372036854775807。如果您使用的是32位系統(我希望你),它可能是2147483647

+0

在32位機器上,它是2147483647. – Sjoerd

+0

@Sjoerd:你說得對,我的錯。我糾正了我的答案。忘記我在我的筆記本電腦上。 :-P – FtDRbwLXw6

-2

你有沒有試過這樣:

如果(空( $ _GET [「lic」]))$ lic = intval($ _GET [「lic」]); else $ e = true;

echo($ lic%11);

+0

這不起作用。 Intval返回一個int,並且8911076856不適合int。即'intval(8911076856)'會給32位機器上的321142264。 – Sjoerd