【问题标题】:Linearly scaling a number in a certain range to a new range将某个范围内的数字线性缩放到新范围
【发布时间】:2013-03-06 17:42:22
【问题描述】:

我制作了一个缩放函数,它采用区间 [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 上找到答案。然而,提出这个问题的人没有提到他最终做了什么来解决这个问题。这个问题说它可能与混合数据类型有关,但是我将所有内容都转换为浮点数我错过了什么吗?

【问题讨论】:

  • 我不会在参数值上使用!=。做!==.
  • 首先删除parseFloat。 JavaScript 只知道“数字”,不知道“int”或“float”。
  • 范围 (0 -> 20) - 10 ?
  • 你的函数对我有用:linearScaling(0, 20, -10, 10, 5) => "-5.00"
  • 也许您也应该使用更多行:v -= oldMin; v /= oldMax; v *= newMax; v += newMin;

标签: javascript function scaling


【解决方案1】:

现在您展示了如何调用您的函数,我可以重现您的问题 - 即应该映射到负域的引用数字没有。

这似乎是由于 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

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

【讨论】:

  • 天哪,多么愚蠢的小错误,但感谢您帮助我并指出问题,我现在完全理解了。我通过将每个变量乘以 1 来修复我的函数,因此用户是否使用引号调用函数都没关系
  • 不,我没有:你的意思是像单击某处以确认我的问题已解决?
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 2014-03-14
  • 2012-12-31
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多