我做了一个缩放函数,它在一个区间[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找到答案。然而,问这个问题的人没有提到他最后做了什么来修复它。那个问题说它可能与混合数据类型有关,但我将所有内容转换为浮点数我错过了什么吗?
答案 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
我希望这能说明问题的原因和解决方案。