سؤال

لماذا إخراج sqrt ليس عددا صحيحا ل "16" في فب؟

مثال

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 بمثابة بيثون. كيف يمكنك معرفة ذلك بعد ذلك عندما يكون الرقم المعطى صحيحا بعد أخذ جذر مربع؟

فكيف يمكنك التمييز بين 4 و 4.12323 في PHP دون استخدام Regex؟

هل كانت مفيدة؟

المحلول

وفقا لدليل PHP، float sqrt ( float $arg ), ، SQRT () دائما إرجاع تعويم. لن يحل وظيفة استخدام IS_INT () المشكلة لأنه يتحقق من DataType وإرجاع الفشل.

للحصول على هذا، يمكنك اختباره باستخدام Modulus بدلا من ذلك: (يجب أن يكون 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
}

نصائح أخرى

لا، ليس صحيحا. انها تعويم.

يقول ذلك بشكل صحيح في API، نوع العودة هو تعويم.

http://us2.php.net/sqrt.

 float sqrt  ( float $arg  )

إرجاع الجذر التربيعي للألغام.

يمكنك استخدام وظيفة الأرضية للحصول على الجزء الأمثل من القيمة وطرح القيمة الأصلية. إذا كان الفرق هو! = 0 ثم ليس عددا صحيحا. على سبيل المثال

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

لأنه يعيد دائما تعويم:

float sqrt(float $arg)

يمكنك إلقاء ذلك في عدد صحيح إذا كنت تريد:

intval(sqrt(16));

تحرير، حسنا بعد ذلك:

$sqrt = sqrt(16);

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

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

var_dump($sqrt);

وسيتم صب طريقة أخرى للتحقق من الأعداد الصحيحة إلى سلسلة وتحقق من ذلك ctype_digit()

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

بالطبع هذه طريقة غريبة إلى حد ما مقارنة باستخدام modulo عندما تقوم بعمل حسابات على أي حال. لكنه مفيد عند اختبار القيم المنشورة من نموذج، لأنها ستكون سلاسل للبدء بها. التحذير هو أنه سيعود FALSE لعدد صحيح سلبي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top