我有問題,此代碼:PHP模返回錯誤的結果
if (!empty($_GET[ "lic" ])) $lic = $_GET[ "lic" ]; else $e = true;
echo ($lic % 11);
當我發佈8911076856
呼應1
,但它應該是0
。
我有問題,此代碼:PHP模返回錯誤的結果
if (!empty($_GET[ "lic" ])) $lic = $_GET[ "lic" ]; else $e = true;
echo ($lic % 11);
當我發佈8911076856
呼應1
,但它應該是0
。
使用fmod:
echo fmod(8911076856, 11);
+1。出於好奇,'fmod()'超過'(float)$ x%(float)$ y'只是結果的精確度? – FtDRbwLXw6
不,'(float)$ x%(float)$ y'不能爲PHP_INT_MAX以上的$ x值給出正確的結果。例如。 '(float)8911076856%(float)10'給出4而不是6.顯然,模運算符將這兩個參數都轉換回int。 – Sjoerd
啊,很高興知道!謝謝。 – FtDRbwLXw6
這很可能是因爲您發佈的數量高於PHP_INT_MAX
,這是大多數64位系統AFAIK上的9223372036854775807。如果您使用的是32位系統(我希望你),它可能是2147483647
在32位機器上,它是2147483647. – Sjoerd
@Sjoerd:你說得對,我的錯。我糾正了我的答案。忘記我在我的筆記本電腦上。 :-P – FtDRbwLXw6
你有沒有試過這樣:
如果(空( $ _GET [「lic」]))$ lic = intval($ _GET [「lic」]); else $ e = true;
echo($ lic%11);
這不起作用。 Intval返回一個int,並且8911076856不適合int。即'intval(8911076856)'會給32位機器上的321142264。 – Sjoerd
可能是因爲'8911076856'對於int而言太高了,而且溢出了? – andrewsi
我認爲這不是問題'var_dump(8911076856%11);'returns'int(0)'。在回調模之前調用'var_dump($ lic)'。 – Florent
@Florent - 就是這個問題。這是一個32位系統,他試圖處理太大的值以適應4字節的整數。您可能在64位系統上進行測試。 –