我有问题,此代码: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位系统上进行测试。 –