هل هناك أي وظيفة java أو فئة util التي تقارن بهذه الطريقة: func (3/2) = 2؟

StackOverflow https://stackoverflow.com/questions/1074228

  •  21-08-2019
  •  | 
  •  

سؤال

هل هناك أي وظيفة جافا أو استخدامها class الذي يدور بهذه الطريقة: func(3/2) = 2

Math.ceil() لا يساعد ، والتي كان ينبغي أن تفعل ذلك بالاسم. أنا على علم BigDecimal, ولكن لا تحتاجه.

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

المحلول

Math.ceil() سوف تتجول دائمًا ، ولكنك تقوم بتقسيم عدد صحيح مع 3/2. وهكذا ، لأنه في قسم عدد صحيح 3/2 = 1 (ليس 1.5) سقف 1 هو 1.

ما تحتاج إلى القيام به لتحقيق النتائج التي تريدها هو Math.ceil(3/2.0);

من خلال القيام بالقسمة بمقدار مزدوج (2.0) ، ينتهي بك الأمر إلى القيام بتقسيم النقطة العائمة بدلاً من تقسيم عدد صحيح. هكذا 3/2.0 = 1.5, ، و ال ceil() من 1.5 دائما 2.

نصائح أخرى

قليلا من السحر الأسود ، ويمكنك أن تفعل كل شيء مع الأعداد الصحيحة:

// Divide x by n rounding up
int res = (x+n-1)/n

يمكنك دائمًا الإلقاء أولاً:

Math.ceil((double)3/2)

لتحويل قسم الأرضية إلى قسم السقف:

(numerator + denominator-1) / denominator

لتحويل قسم الطابق إلى قسم التقريب:

(numerator + (denominator)/2) / denominator

في Java ، 3/2 = 1 لأنه يستخدم تقسيم عدد صحيح. لا توجد وظيفة يمكنها "إصلاح" هذا بعد ذلك. ما عليك فعله هو إجبار تعويم على النتيجة:

int result = (int)Math.ceil( ((float)3) / ((float)2) );

ليست هذه الحالة المعتادة لتقسيم عدد صحيح؟ جرب Math.ceil بعد إلقاء أي من الرقم إلى نوع النقطة العائمة.

العديد من اللغات "فكر" مثل هذا. إذا كنت تقسم int إلى int ، فعليك الحصول على int (بحيث تقطع وستحصل على 1 نتيجة لذلك).

نعلم جميعًا أن هذا ليس صحيحًا ، لكن هكذا يعملون. يمكنك "خداعهم" ، والقيام بشيء مثل إلقاء أحدهم على مضاعفة ، أو استخدام تمثيل مزدوج: Math.ceil (3.0 / 2) أو Math.ceil((double)3/2), ، كما ذكر.

Math.Ceil إرادة مساعدة ، شريطة أن تستخدم أرقام النقاط العائمة. المشكلة هي أن 3/2 ، في تقسيم عدد صحيح ، هي 1. بحلول الوقت الذي تصل فيه القيمة إلى أي وظيفة ، سواء كانت الرياضيات.

if (a % b == 0)
{
  return (a / b);
}
else
{
  return (a / b) + 1;
}

يستغل قسم عدد صحيح لفعل ما تريد. لا أعرف وظيفة الرياضيات التي تفعل ذلك ، ولكن لماذا لا تتدحرج؟

يعمل الجزء أدناه مع الأعداد الصحيحة السلبية أيضًا:

public static int divRoundUp(int x, int n) {
    if (n<=0) throw new RuntimeException("conceived wt. pos. dividers (was:"+n+")");
    int ret = (x+(n-1)*(x>0?1:0))/n;
    return ret;
}

أحب إجابة راندي بروكتور الأفضل. هنا بمزيد من التفصيل:

إذا كنت ترغب في القيام بتقريب حقيقي (أي 3/2 -> 2 ، ولكن 17/7 -> 2) مع الأعداد الصحيحة> 0: استخدم (dividend + (divisor / 2)) / divisor بدلاً من dividend / divisor.

إذا كان بإمكان توزيع الأرباح أي عدد صحيح (أي سلبي مسموح به):(dividend >= 0) ? ((dividend + divisor / 2) / divisor) : ((dividend - divisor / 2) / divisor).

إذا كان توزيعات الأرباح هو أي عدد صحيح ومقاطع أي عدد صحيح ولكن 0:(dividend >= 0) ? ((dividend + Math.abs(divisor) / 2) / divisor) : ((dividend - Math.abs(divisor) / 2) / divisor).

(لاحظ أن الإضافة والتشكيل يمكن أن يتسبب في التفاف الذي لا يحدث ، مما يجعل النتيجة غير صحيحة.)

فيما يلي طريقة قمت بإنشائها للتعامل مع تقسيم INT دون استخدام جولة الرياضيات والكسب لتطفو. هذا يعمل للأرقام الإيجابية والسلبية. إنه يعمل عن طريق إضافة نصف المقام لتعويض التقريب لأسفل

public static int div_Int(int num, int den){
    if(num > 0 && den > 0 || num < 0 && den < 0 ){
        return ((2*num)+ den)/(2*den);  
    }else{
        return ((2*num)- den)/(2*den);
    }

}

إذا كنت تريد أن تقسم على 2 ، يمكنك القيام بذلك:

n - n / 2

وبشكل عام:

(n - 1) / d + 1 == (n + d - 1) / d

هذا ينطبق على أعداد صحيحة غير سالبة. تعتمد كيفية تمديدها إلى أعداد صحيحة سلبية على ما تعنيه مع "هل يدور بهذه الطريقة". يتم تقريب التقسيم الصحيح نحو الصفر ، في حين Math.ceil() جولات و Math.floor() جولات لأسفل. فمثلا n / 2 != (int) Math.floor(n / 2.0) إلى عن على n == -5.

إذا كنت ترغب دائمًا في التقريب ، فيمكنك الاستخدام Math.ceil() كما في هذا الجواب.

إذا كنت ترغب حقًا في تجنب استخدام Ceil و Casting ، فإليك طريقة صغيرة تنجز نفس الشيء.

public int findCeil(int X, int Y) {
        if (X % Y == 0){
            return X / Y;
        } else {
            return X / Y + 1;
        }
    }

هل جربت Math.floor() ?

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