2013-03-06 68 views
0

我已经制作了一个缩放功能,它将间隔[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时 - > 10

我已尽我所能在this site上找到答案。然而,提问的人没有提到他最终做了什么来解决问题。这个问题说它可能与混合数据类型有关,但我将所有东西都转换为浮点数,我错过了什么?

+1

我不会在参数值上使用'!='。做'!=='。 – 2013-03-06 17:44:55

+0

首先删除'parseFloat'。 JavaScript只知道“数字”,没有“int”或“float”。 – kay 2013-03-06 17:45:33

+0

范围(0 - > 20) - 10? – 2013-03-06 17:46:14

回答

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; 

当你在你的函数声明的开头添加这些行,一切工作顺利 - 不管你如何调用这个函数。或者只是将它的值称为不在引号中 - 这是在这个特定情况下造成麻烦的人。

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 

我希望这说明了问题的原因,以及解决方案。

+0

噢,我的上帝是一个多么愚蠢的小错误,但是谢谢你帮助我,指出问题如此之好,我现在完全明白了。 我通过将每个变量与1相乘来修正了我的功能,因此用户使用引号或不使用012来调用函数并不重要 – 2013-03-07 08:57:22

+0

很高兴喜欢答案。你知道如何“接受”它吗? – Floris 2013-03-07 13:12:28

+0

不,我不喜欢:你的意思是像点击某处,以确认我的问题解决? – 2013-03-08 07:09:39