0

我制作了一个缩放函数,它采用区间中的数字[oldMin,oldMax]并将它们线性缩放到 range [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 时,它似乎没有给出正确的输出

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

4

1 回答 1

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, 来举个例子。然后,当您执行 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

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

于 2013-03-06T19:32:45.260 回答