2009-10-31 11 views
7

sqrtの出力がPHPで "16"の整数でないのはなぜですか?PHPの平方根

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 > 

私はこの問題は、PHPは、Pythonと同様に隠し内部プレゼンテーションであると感じています。 平方根をとった後、与えられた数字が整数であることを、どうやって知ることができますか?

正規表現を使用せずにPHPで44.12323を区別するにはどうすればよいですか?

答えて

15

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

、あなたの代わりに係数を使用してそれをテストすることができます:((FMODでなければなりません)浮動小数点弾性率ではなく、整数係数のために%演算子のために)

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

あなたはPHP 5.2を使用している場合0.0以降、私はこれも動作しますが、私は特定する状況のこのタイプでそれを使用していないと信じて:

$result = sqrt(16); 
if (filter_var($result, FILTER_VALIDATE_INT)) { 
    // is an integer 
} 
+0

あなたの最初のコマンドは私にとっては機能しませんが、最後のコマンドは機能します。 –

+0

あなたはそうです。最初のものも今でも動作します。私は編集を投稿する前にそれを二重にチェックしました。 – Jason

+0

補足として、(float%1)を使用して整数をテストすることは、JavaScriptとMySQLでは機能しますが、%ではなくfmod()を必要とするPHPでは機能しません。 – Jason

2

それは常にfloatを返すので:

float sqrt(float $arg) 

したい場合は、整数にそれをキャストすることができます:

intval(sqrt(16)); 

がEDIT、[OK]を、その後:

$sqrt = sqrt(16); 

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

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

var_dump($sqrt); 
+1

'intval'の問題は、それが四捨五入されていることです。私は、平方根を取った後ではない整数であることを正確に知る必要があります。 –

5

それはAPIで正しいと言います。戻り値の型はfloatです。

http://us2.php.net/sqrt

float sqrt (float $arg ) 

引数の平方根を返します。

3

あなたが値の整数部分を取得するために床関数を使用することができますし、元の値を減算します。差が!= 0の場合、NOTは整数です。例えば整数をチェックする

if (($sq - floor($sq)) == 0){ 
    YES 
}else{ 
NO 
} 
+1

これも良い方法です。クヌスの機能を指摘してくれてありがとう! –

0

もう一つの方法は、文字列にキャストし、もちろんctype_digit()

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

で、これはあなたがとにかく計算を行っている際にモジュロを使用する場合と比較してやや奇妙な方法であることをチェックすることになります。しかし、フォームから投稿された値をテストするときは、まずは文字列になるので便利です。 負の整数に対してはfalseを返すという警告があります。