PHP中的意外行为 - 相同的代码在C#和Python中提供了正确的结果

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),然后你会得到正确的结果.


ATa*_*lor 6

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无限,因为循环本身是无限的.


Mar*_*ius 5

发生的事情是:

$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)

将解决问题.

  • 转换运算符优先于算术运算符,因此您只需要转换$ n变量,而不是除法的结果.[PHP运算符优先级](http://php.net/manual/en/language.operators.precedence.php) (2认同)