spi*_*dEY 16 php c# python math
为什么PHP为以下代码返回INF(无穷大):
<?php
$n = 1234;
$m = 0;
while ($n > 0)
{
$m = ($m * 10) + ($n % 10);
$n = $n / 10;
}
var_dump($m);
?>
Run Code Online (Sandbox Code Playgroud)
预期的结果是4321,但PHP返回INF,浮点类型:
float INF
Run Code Online (Sandbox Code Playgroud)
我在Python和C#中编写了相同的代码并获得了预期的输出 - 4321
蟒蛇
n = 1234
m = 0
while (n > 0):
m = (m * 10) + (n % 10)
n = n / 10
print m
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
xda*_*azz 13
在php $n / 10中将返回一个浮点数,而不是整数.
所以$n > 0永远都是true.
更改 while($n > 0)
到while($n > 1)或while((int)$n > 0),然后你会得到正确的结果.
PHP是无类型的,可以"即时"转换.
这意味着,$ n将永远不会为'0'或更低,因为$ n将在需要时成为'浮动'.
尝试检查<1,你应该没事.
为了澄清这一点,$ n的行为如下:
$ n = 1234 $ n = 123.4 $ n = 12.34 $ n = 1.234 $ n = 0.1234 $ n = 0.01234等
含义:$ n将始终接近0,但永远不会达到它.这使得$ m无限,因为循环本身是无限的.
发生的事情是:
$n = $n / 10;
Run Code Online (Sandbox Code Playgroud)
执行浮点除法而不是整数除法,因此$ n永远不会达到值0,它只接近0的值,即0.0 ... 1234.
将上面的代码更改为:
$n = (int)($n / 10);
Run Code Online (Sandbox Code Playgroud)
将解决问题.