16

为什么 PHP 会为以下代码返回 INF(无穷大):

<?php
$n = 1234;
$m = 0;

while ($n > 0)
{
    $m = ($m * 10) + ($n % 10);
    $n = $n / 10;
}

var_dump($m);
?>

预期的结果是4321,但是 PHP 返回了INF,浮点类型:

float INF

我用 Python 和 C# 编写了相同的代码并得到了预期的输出 - 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();
}
4

6 回答 6

13

在 php$n / 10中将返回一个浮点数,而不是整数。

$n > 0将永远如此true

改变while($n > 0)

while($n > 1)or while((int)$n > 0),那么你会得到正确的结果。

于 2012-09-06T10:25:22.910 回答
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 无限,因为循环本身是无限的。

于 2012-09-06T10:23:58.523 回答
5

正在发生的事情是:

$n = $n / 10;

正在执行浮点除法而不是整数除法,因此 $n 永远不会达到 0 的值,它只是接近 0 的值,即 0.0...1234。

把上面的代码改成这样:

$n = (int)($n / 10);

将解决问题。

于 2012-09-06T10:23:53.510 回答
2

正确的算法使用 floor()

<?php
$n = 1234;
$m = 0;

while ($n > 0)
{
    $m = $m * 10 + ($n % 10);
    $n = floor($n / 10);
}

var_dump($m);
于 2012-09-06T10:36:21.923 回答
0

由于典型的浮点运算,这更有可能。

如果您使用 BCMath 任意精度数学,则不会产生相同的效果。

$n = 1234;
$m = 0;

while ($n > 0)
{
    $m = bcmul($m, 10) + bcmod($n, 10);
    $n = bcdiv($n, 10);
}

var_dump($m);

http://codepad.viper-7.com/FYNCyN

也可以看看:

http://php.net/manual/en/language.types.float.php

于 2012-09-06T10:23:38.057 回答
0
$n = intval($n / 10);

这似乎解决了问题。

于 2012-09-06T10:27:15.127 回答