[英]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.