2012-08-22 45 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