为什么PHP会为以下代码返回INF (infinity):
<?php
$n = 1234;
$m = 0;
while ($n > 0)
{
$m = ($m * 10) + ($n % 10);
$n = $n / 10;
}
var_dump($m);
?>
预期的结果是4321,但返回的是INF,浮动类型:
float INF
我用和C#编写了相同的代码,并获得了预期的输出- Python 4321
Python
n = 1234
m = 0
while (n > 0):
m = (m * 10) + (n % 10)
n = n / 10
print m
C#
static void Main(string[] args)
{
int n = 1234;
int m = 0;
while (n > 0)
{
m = (m * 10) + (n % 10);
n = n / 10;
}
Console.WriteLine(m);
Console.ReadLine();
}
发布于 2012-09-06 18:25:23
在php中,$n / 10
将返回一个浮点数,而不是整数。
因此,$n > 0
将始终为true
。
更改while($n > 0)
设置为while($n > 1)
或while((int)$n > 0)
,那么您将获得正确的结果。
发布于 2012-09-06 18:23:59
PHP是无类型的,可以“即时”转换。
这意味着,你的浮点数永远不会是'0‘或更低,因为在需要的时候,$n将是一个’$n‘。
尝试检查< 1,您应该没问题。
为了澄清这一点,$n的行为如下所示:
$n = 1234 $n = 123.4 $n = 12.34 $n = 1.234 $n = 0.1234 $n = 0.01234等
含义:$n将始终接近0,但永远不会达到它。这使得$m是无限的,因为循环本身是无限的。
发布于 2012-09-06 18:23:54
正在发生的情况是:
$n = $n / 10;
正在执行浮点数除法而不是整数除法,因此$n永远不会达到0的值,它只是接近0的值,即0.0...1234。
将上面的代码更改为:
$n = (int)($n / 10);
将会解决这个问题。
https://stackoverflow.com/questions/12297872
复制相似问题