2009-10-31 99 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的內部呈現。 那麼你怎麼知道給定的數字在取平方根後是整數?

那麼如何區分44.12323而不使用正則表達式呢?

回答

15

根據PHP手冊float sqrt (float $arg),sqrt()總是返回一個浮點數。使用is_int()函數不會解決問題,因爲它檢查數據類型並返回失敗。

要解決這個問題,你可以通過使用模量,而不是對其進行測試:如果你使用PHP 5.2(必須是FMOD()的浮點模量,而不是整數模%運算符)

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

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

編輯,那好吧:

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

返回arg的平方根。

3

可以使用地板函數來獲取值的整數部分,減去原始值。如果差異是!= 0,那麼它不是一個整數。例如

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

這也是一個好方法。感謝您指出Knuth的功能! –

0

另一種方式來檢查整數將被強制轉換爲字符串,並檢查與ctype_digit()

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

當然,這是一個有些奇怪的方式相比,使用模當你反正做計算。但是當測試從表單發佈的值時它很方便,因爲它們將是字符串。 一個警告是它會返回一個負整數爲假。