将某个范围内的数字线性缩放到新范围

时间:2013-03-06 17:42:22

标签: javascript function scaling

我做了一个缩放函数,它在一个区间[oldMin,oldMax]中取数字并将它们线性缩放到范围[newMin,newMax]。使用负值时,它似乎不起作用。

function linearScaling(oldMin, oldMax, newMin, newMax, oldValue){
        var newValue;
        if(oldMin !== oldMax && newMin !== newMax){
            newValue = parseFloat((((oldValue - oldMin) * (newMax - newMin)) / (oldMax - oldMin))  + newMin);
            newValue = newValue.toFixed(2);
        }
        else{
            newValue = error;
        }
        return newValue;
}

当从0开始缩放值时,此函数似乎有效 - > 32761到范围0->然而,当给出新的负范围,即-10->时,它似乎没有给出正确的输出。 10

我尽力在this site找到答案。然而,问这个问题的人没有提到他最后做了什么来修复它。那个问题说它可能与混合数据类型有关,但我将所有内容转换为浮点数我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

现在您已经展示了如何调用您的函数,我可以重现您的问题 - 即应该映射到否定域的引用数字不会。

这似乎是由于Javascript对数字和字符串之间的差异非常宽松 - 如果它不确定如何处理两个数字(因为其中一个似乎是一个字符串),它假设您想要连接而不是添加。换句话说 - 通过将newMin值传递为'-10'而不是-10,您混淆了JS。

举个简单的例子,

document.write('1' + '-2');

产生

1-2

然而,

document.write(1*'1' + 1*'-2');

结果

-1

你所添加的oldMin

表达了“可能的连接”
newValue = (((oldValue - oldMin) * (newMax - newMin)) / (oldMax - oldMin))  + newMin;

将newMin设置为“-10”,您可能会newValue看起来像6-10而不是-4,举个例子。然后,当您执行parseFloat时,Javascript将在字符串中悄悄地通过减号运行,并返回6而不是评估表达式并提出-4

要清除混淆,请将每个参数乘以1,使其成为“真正的数字”:

oldMin = 1*oldMin;
oldMax = 1*oldMax;
newMin = 1*newMin;
newMax = 1*newMax;
oldValue = 1*oldValue;

当您在函数声明的开头添加这些行时,无论您如何调用该函数,一切都会顺利进行。或者只是使用newMin值而不是引号来调用它 - 它是导致此特定实例出现问题的那个。

  document.writeln('the new code called with parameter = 100:\n');
  document.writeln(linearScaling('0', '32761', '-10', '10', 100)+'<br>');
  document.writeln('the old code called with parameter = 100:\n');
  document.writeln(linearScalingOld('0.0', '32761.0', '-10.0', '10.0', '100.0')+'<br>');
  document.writeln('the old code called with unquoted parameters:\n');
  document.writeln(linearScalingOld(0.0, 32761.0, -10.0, 10.0, 100.0)+'<br>');

导致以下结果:

the new code called with parameter = 100: -9.94
the old code called with parameter = 100: 0.06
the old code called with unquoted parameters: -9.94

我希望这能说明问题的原因和解决方案。