كيف يمكنني تحديد ما إذا كان رقم ضمن نسبة مئوية من رقم آخر

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

سؤال

أنا أكتب رمز iPhone الذي يتعرف بشكل عصبي على ما إذا كان سطر Sciped مستقيم. أحصل على تحمل النقاطتين النهائية ومقارنته ب 0 و 90 و 180 و 270 درجة مع التسامح من 10 درجات زائد أو ناقص. الآن أفعل ذلك مع مجموعة من الكتل، والتي تبدو سوبر clunky.

كيف تكتب وظيفة، بالنظر إلى تحمل 0..360، تفاوت النسبة المئوية (قل 20٪ = (-10 درجة إلى + 10 درجة)) زاوية مثل 90 درجة، إرجاع ما إذا كان الحاملة ضمن التسامح؟

تحديث: أنا، ربما، كونها محددة للغاية. أعتقد أن وظيفة عامة لطيفة تحدد ما إذا كان هناك عدد في نسبة مئوية من رقم آخر لديه فائدة في العديد من المجالات.

على سبيل المثال: هو الرقم swipelength. داخل 10% من maxswipe.ب سيكون ذلك مفيدا.

 BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
      // dunno how to calculate
 }

 BOOL result;

 float swipeLength1 = 303; 
 float swipeLength2 = 310; 

 float tolerance = 10.0; // from -5% to 5%
 float maxSwipe = 320.0;

 result = isNumberWithinPercentOfNumber(swipeLength1, tolerance, maxSwipe); 
 // result = NO

 result = isNumberWithinPercentOfNumber(swipeLength2, tolerance, maxSwipe);
 // result = YES

هل ترى ما أحصل عليه؟

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

المحلول

20٪ باعتبارها عشرية تساوي 0.2. مجرد تقسيم 100.0 للحصول على العشرية. قسم 2.0 للحصول على نصف النطاق المقبول. (جنبا إلى جنب في 200.0 مقسم)

من هناك، إضافة وطرح من 1.0 للحصول على 90٪، و 110٪ من القيم. إذا كان الرقم الأول بين النطاقات، فهذا هناك لديك.

BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
      float decimalPercent = percent / 200.0;
      float highRange = secondN * (1.0 + decimalPercent);
      float lowRange = secondN * (1.0 - decimalPercent);
      return lowRange <= firstN && firstN <= highRange;
 }

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

تحديث: لجعل النسبة المئوية لتضمين كل من +/- نطاق.

نصائح أخرى

int AngularDistance (int angle, int targetAngle) 
{

    int diff = 0;
    diff = abs(targetAngle - angle)

    if (diff > 180) diff = 360 - diff;

    return diff;
}

هذا يجب أن يعمل لأي زاويتين.

الإجابة على سؤالك المكرر / الجديد:

bool isNumberWithinPercentOfNumber (float n1, float percentage, float n2)
{

if (n2 == 0.0) //check for div by zero, may not be necessary for float
   return false; //default for a target value of zero is false
else
   return (percentage > abs(abs(n2 - n1)/n2)*100.0);
}

لشرح، يمكنك الاختلاف المطلق بين الاختبار والقيمة المستهدفة، وقسمه بالقيمة المستهدفة (المكالمات الطرفين "التأكد من أن هذا يعمل مع الأهداف السلبية والأرقام الاختبار أيضا، ولكن ليس مع النسب المئوية / التحمل السلبية) وبعد يمنحك هذا النسبة المئوية للفارق المعبر عنه ككسر عشري، يضاعفه مع 100 لإعطاء التعبير "المشترك" من النسبة المئوية (10٪ = 0.10)،

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