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 型を返しました。

float INF

Python と C# で同じコードを書き、期待どおりの出力を得ました - 4321

パイソン

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)またはにwhile((int)$n > 0)すると、正しい結果が得られます。

于 2012-09-06T10:25:22.910 に答える
6

PHPはタイプレスであり、「オンザフライ」で変換します。

つまり、必要に応じて$ nが「フロート」になるため、$nが「0」以下になることはありません。

<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 Arbitrary Precision Mathematicsを使用する場合、同じ効果はありません。

$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 に答える