7

PHPで「16」の出力がsqrt整数ではないのはなぜですか?

php > $fig = 16;
php > $sq = sqrt($fig); //should be 4
php > echo $sq;
4
php > echo is_int($sq);            // should give 1, but gives false
php > 

問題は Python と同様に PHP が隠している内部表示にあるように感じます。平方根を取った後、与えられた数値が整数であることをどのように知ることができますか?

では、正規表現を使用せずに PHPで4とを区別するにはどうすればよいでしょうか?4.12323

4

6 に答える 6

16

PHP マニュアルによるとfloat sqrt ( float $arg )、sqrt() は常に float を返します。is_int() 関数を使用しても、データ型をチェックして失敗を返すため、問題は解決しません。

これを回避するには、代わりにモジュラスを使用してテストできます: (整数モジュラスの % 演算子ではなく、浮動小数点モジュラスの場合は fmod() である必要があります)

if (fmod(sqrt(16), 1) == 0) {
   // is an integer
}

PHP 5.2.0 以降を使用している場合は、これも機能すると思いますが、この種の状況では確実に使用していません。

$result = sqrt(16);
if (filter_var($result, FILTER_VALIDATE_INT)) {
    // is an integer
}
于 2009-10-31T14:25:21.947 に答える
9

いいえ、整数ではありません。フロートです。

于 2009-10-31T14:19:24.250 に答える
5

API で正しく言うと、戻り値の型は float です。

http://us2.php.net/sqrt

 float sqrt  ( float $arg  )

arg の平方根を返します。

于 2009-10-31T14:22:58.633 に答える
3

floor 関数を使用して、値の整数部分を取得し、元の値を減算できます。差が != 0 の場合、整数ではありません。例えば

if (($sq - floor($sq)) == 0){
   YES
}else{
 NO
}
于 2009-10-31T14:29:09.817 に答える
2

常にフロートを返すため:

float sqrt(float $arg)

必要に応じて、整数にキャストできます。

intval(sqrt(16));

編集、わかりました:

$sqrt = sqrt(16);

if (strpos($sqrt, '.') !== false)
{
    $sqrt = intval($sqrt);
}

else
{
    $sqrt = floatval($sqrt);
}

var_dump($sqrt);
于 2009-10-31T14:20:55.433 に答える
0

整数をチェックする別の方法は、文字列にキャストしてそれをチェックすることですctype_digit()

$result = sqrt(16);
if (ctype_digit((string)$result)) {
   // is an integer
}

もちろん、これは、とにかく計算を行っているときに modulo を使用するのに比べて、やや奇妙な方法です。ただし、フォームから投稿された値をテストする場合は、最初は文字列になるため便利です。注意点は、負の整数に対して false を返すことです。

于 2009-10-31T14:34:30.757 に答える