如何计算相对百分比(将分数应用到新范围)?

时间:2017-03-15 00:09:02

标签: javascript math pseudocode

我是一名前端和后端开发人员,在处理简单的游戏开发和动画时,我曾遇到过几次这样的挑战。我希望我有一个功能来解决这个问题,所以我希望你们数学家/ gals可以帮助我使用伪代码,然后我可以发布一个我们可以通过浏览器运行的功能来测试它。

对我来说解释这个挑战有点困难,所以请原谅我,我会像一个谜语一样把它给出来:

  

您试图以百分比的形式找到您的考试成绩。您知道,对于正常百分比,表示为0.00 - 1.00的小数,您可以执行actual_test_score / max_test_score之类的操作。

     

但是,你并不是在寻找任何旧的百分比。您希望将百分比表示为十进制数的指定范围内的十进制。例如,您希望(给定actual_test_scoremax_test_score)将您的考试成绩作为0.50 - 1.00的百分比。

     

如何计算actual_test_score / max_test_score表示为0.50 - 1.00范围之间的百分比,而不是0.00 - 1.00的典型范围。

花了一段时间来解释这个问题(这可能不是最好的解释),因为它不是我经常要解释的东西,但它又是我现在遇到的东西,然后

2 个答案:

答案 0 :(得分:2)

这是从[0,1]到[newMin,newMax]的线性范围映射,这是从[oldMin,oldMax]到[newMin,newMax]的一般线性范围映射的特定情况:

function linearRemap(value, oldMin, oldMax, newMin, newMax) {
    var newScale = newMax - newMin;
    var valueAsPct = (val - oldMin) / (oldMax - oldMin);
    var scaledValue = valueAsPct * newScale;
    var shiftedAndScaledValue = scaledValue + newMin;
    return shiftedAndScaledValue;
}

因此,此处的有限案例允许您跳过百分比计算行:

function linearRemapPct(valueAsPct, newMin, newMax) {
    var newScale = newMax - newMin;
    var scaledValue = valueAsPct * newScale;
    var shiftedAndScaledValue = scaledValue + newMin;
    return shiftedAndScaledValue;
}

或者只是

function linearRemapPct(valueAsPct, newMin, newMax) {
    return (valueAsPct * (newMax - newMin) + newMin);
}

如果你想要一些关于精度损失更加小心的东西:

function linearRemapPct(valueAsPct, newMin, newMax) {
    return (valueAsPct * newMax) + (1 - valueAsPct) * newMin;
}

答案 1 :(得分:0)

如果我正确阅读此内容,您是否希望将0表示为0.5

在这种情况下,您需要将您的数字乘以得分范围; highest_score - lowest_score,在您的情况下似乎是1 - 0.5。 然后将lowest_score添加到您的结果中。

这是一个粗略函数形式的例子;

function relative_percentage (score, max_score, min_score) {
    // score should be a value from 0 to 1.
    return score * (max_score - min_score) + min_score;
}