繁体   English   中英

将数字范围映射到0到100

[英]Map Range of Numbers to 0 through 100

我有可能在+/- 6之间的数字包括0(即6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6)超出了我在PHP中使用的排名算法。

我不想返回+/- 6,而是返回0到100之间的数字。相关性类似于:

100 = +6
..
75 = +3
..
50 = 0
..
25 = -3
..
0 = -6

考虑到排名算法的输出范围,如何在PHP中以编程方式实现这一目标? 我考虑过以下内容,但不确定最佳方法:

function score_alg($x) {
  if ($x == '6')
    return 100;
  if ($x == '3')
    return 75;
  if ($x == '0')
    return 50;
  if ($x == '-3')
    return 25;
  if ($x == '-6')
    return 0;
}

这将工作:

function score_alg($x) {
  return round(($x+6)*(100/12));
}

另一种变化:

// Converts a range of numbers to a percentage scale
// $n       number to convert
// $lRange  lowest number of the range  [-6 default]
// $hRange  highest number in the range [6 default]
// $scale   percentage scale            [100 default]
function toPct($n, $lRange = -6, $hRange = 6, $scale = 100){
  // reversed high and low
  if ($lRange > $hRange){
    $lRange = $lRange + $hRange;
    $hRange = $lRange - $hRange;
    $lRange = $lRange - $hRange;
  }

  // input validation
  if ($n < $lRange || $n > $hRange) {
    trigger_error('$n does not fall within the supplied range', E_USER_ERROR);
    return FALSE;
  }

  // edge cases
  if ($n == $lRange) return 0;
  if ($n == $hRange) return $scale;

  // everything in between
  $range = $hRange - $lRange;
  if ($lRange < 0){
    $n += abs($lRange);
  }
  return ($n / $range) * $scale;
}

示范:

$lRange = -6; $hRange = 6;
for ($i = $lRange; $i <= $hRange; $i++){
  echo $i . ' = ' . toPct($i, $lRange, $hRange) . PHP_EOL;
}

输出:

-6 = 0
-5 = 8.3333333333333
-4 = 16.666666666667
-3 = 25
-2 = 33.333333333333
-1 = 41.666666666667
0  = 50
1  = 58.333333333333
2  = 66.666666666667
3  = 75
4  = 83.333333333333
5  = 91.666666666667
6  = 100

您可以“扩展”范围:

function score_alg($x) {
    return round(($x + 6) * (100 / 12));
}

您将执行以下操作:

function score_alg($x) {
  $val = ($x + 6)*(100/12); 
  return round($val);
}

输出:

echo score_alg(6); //100
echo score_alg(3); //75
echo score_alg(0); //50
echo score_alg(-3); //25
echo score_alg(-6); //0

我有一个小的通用范围函数:

function mapToRange($value, $in_min, $in_max, $out_min, $out_max ) {
   return round(($value - $in_min) * ($out_max - $out_min) / ($in_max - $in_min) + $out_min);
}

用法如下:

echo ( mapToRange( 0, -6, 6, 0, 100 )); // output is 50

您可以这样做:

function score_alg($x) {
  return round(($x + 6)*(100/12)); 
}

这里的大多数答案都是针对您的具体情况的,只有一种解决方案可以解决所有情况,但是,这是不正确的。

下面是一个更快的解决方案,应该可以全面使用。

/*
* $value // the value
* $min // minimum value of the range
* $max // maximum value of the range
*/
function toPercentage($value, $min, $max) {
  return ($value - $min) / ($max - $min) * 100;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM