2009-10-31 79 views
7

Tại sao đầu ra của sqrt không phải là số nguyên cho "16" trong PHP?Căn bậc hai trong PHP

Ví dụ

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 > 

Tôi cảm thấy rằng vấn đề là ở cách trình bày nội mà PHP ẩn tương tự như Python. Làm thế nào để bạn có thể biết khi nào con số đã cho là số nguyên sau khi lấy căn bậc hai?

Vậy làm cách nào bạn có thể phân biệt giữa 44.12323 bằng PHP mà không sử dụng regex?

Trả lời

15

Theo hướng dẫn sử dụng PHP, float sqrt (float $arg), sqrt() luôn trả về một phao. Sử dụng hàm is_int() sẽ không giải quyết được vấn đề vì nó kiểm tra kiểu dữ liệu và trả về một lỗi.

Để làm được việc này, bạn có thể kiểm tra nó bằng cách sử dụng mô đun thay vì: (phải fmod() cho điểm mô đun và không phải là nhà điều hành% cho số nguyên mô đun nổi)

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

Nếu bạn đang sử dụng PHP 5.2 .0 hay muộn, tôi tin rằng điều này cũng sẽ làm việc, nhưng tôi đã không sử dụng nó trong loại hoàn cảnh để chắc chắn:

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

Lệnh đầu tiên của bạn không hoạt động đối với tôi, nhưng lệnh cuối cùng hoạt động. –

+0

Bạn nói đúng. Cái đầu tiên cũng hoạt động. Tôi đã kiểm tra kỹ trước khi tôi đăng chỉnh sửa. – Jason

+0

Là một lưu ý phụ, kiểm tra một số nguyên bằng cách sử dụng (float% 1) hoạt động trong JavaScript và MySQL, không phải trong PHP yêu cầu fmod() thay vì%. – Jason

2

Bởi vì nó luôn luôn trả về một float:

float sqrt(float $arg) 

Bạn có thể đúc nó thành một số nguyên nếu bạn muốn:

intval(sqrt(16)); 

EDIT, Ok rồi:

$sqrt = sqrt(16); 

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

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

var_dump($sqrt); 
+1

Vấn đề với 'intval' là nó làm tròn. Tôi cần phải biết chính xác đó là một số nguyên mà không phải là sau khi lấy một căn bậc hai. –

5

Nói đúng trong API, kiểu trả về là float.

http://us2.php.net/sqrt

float sqrt (float $arg ) 

Trả về căn bậc hai của arg.

3

Bạn có thể sử dụng chức năng sàn để có được phần nguyên của giá trị và trừ giá trị ban đầu. Nếu sự khác biệt là! = 0 thì KHÔNG phải là số nguyên. ví dụ.

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

Đây cũng là một phương pháp tốt. Cảm ơn bạn đã chỉ ra chức năng của Knuth! –

0

Một cách khác để kiểm tra số nguyên sẽ được đúc thành một chuỗi và kiểm tra rằng với ctype_digit()

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

Dĩ nhiên đây là một cách khá lạ so với sử dụng modulo khi bạn đang làm tính toán anyway. Nhưng nó rất tiện lợi khi kiểm tra các giá trị được đăng từ một biểu mẫu, vì chúng sẽ là các chuỗi để bắt đầu. Một báo trước là nó sẽ trả về false cho một số nguyên âm.

Các vấn đề liên quan