gpt4 book ai didi

javascript - 将某个范围内的数字线性缩放到新范围

转载 作者:行者123 更新时间:2023-12-02 18:56:51 24 4
gpt4 key购买 nike

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

最佳答案

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

这似乎是因为 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

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

关于javascript - 将某个范围内的数字线性缩放到新范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com