现在您已经展示了如何调用函数,我可以重现您的问题 - 即应该映射到负域的引用数字不会。
这似乎是因为 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
, 来举个例子。然后,当您执行 aparseFloat
时,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
我希望这能说明问题的原因和解决方案。