计算两个边界之间值的百分比的方法



我要进行以下计算:

float value = MY_VALUE;
float percentage = (value - MIN)/(MAX - MIN);
if (percentage < 0)
   percentage = 0;
if (percentage > 1)
   percentage = 1

我只是想知道 Objective-C 或 C 中是否存在一些方法可以帮助实现这一目标,例如将"值"浮点数舍入到 MIN 和 MAX 边界之间的方法。

标准 C

库中没有这样的方法(我不知道 Objective C)。

No.

另一方面,您可能应该更新代码,以防止可能的除以零:

float den = (value - MIN);
float num = (MAX - MIN);
float percentage;
if(den) {
  percentage = num / den;
  if (percentage < 0.0f ) {
    percentage = 0.0f;
  } else if (percentage > 1.0f) {
    percentage = 1.0f;
  } else {
    printf("Percentage: %3.2f",percentage);
  }
} else {
  percentage = 0.0f;
  printf("DIVIDE BY ZERO ERROR!");
}

另外,要小心。甲骨文正在起诉谷歌一段非常相似的代码。您可能需要重新考虑公开发布它:

http://developers.slashdot.org/story/12/05/16/1612228/judge-to-oracle-a-high-schooler-could-write-rangecheck

如果你想用objective-c语法计算百分比,那么这就是你要走的路。

(我认为 Dogbert 在第 6 行弄错了(相反)。这是我所做的,它就像想要的那样工作。

- (CGFloat)calculateProgressForValue:(CGFloat)value start:(CGFloat)start end:(CGFloat)end
{    
    CGFloat diff = (value - start);
    CGFloat scope = (end - start);
    CGFloat progress;
    if(diff != 0.0) {
        progress = diff / scope;
    } else {
        progress = 0.0f;
    }
    return progress;
}

并且您始终可以将其限制为不超过 0.0 或 1.0,如下所示:

- (CGFloat)progressConstrained {
    // example values
    CGFloat start = 80;
    CGFloat end = 160;
    CGFloat a = 100;
    // the constrain
    return MAX(0.0, MIN(1.0, [self calculateProgressForValue:a start:start end:end]))
}

如果你只是想确保一个值不高于或低于其他值,你应该使用 MAX(a, b) 和 MIN(a, b)...

float maxValue = 1.0;
float minValue = 0.0;
float myValue = 2.8;
float myValueConstrained = MAX(minValue, MIN(maxValue, myValue)); // 1.0

MIN(a,b) 取 a 和 b 中的最小值

MAX(a,b) 取 a 和 b 中的最大值


我通常只是这样做:

float myValueConstrained = MAX(0.0, MIN(1.0, myValue));

最新更新