0

[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 を指定すると、正しい出力が得られないようです。

このサイトで答えを見つけるために最善を尽くしました。しかし、質問をした人は、それを修正するために何をしたかについては言及していません。その質問は、混同されたデータ型と関係がある可能性があると言っていますが、すべてをフロートに変換しましたが、何か見逃しましたか?

4

1 に答える 1

2

関数を呼び出す方法を示したので、問題を再現できます。つまり、負のドメインにマップする必要がある引用符で囲まれた数値はマップされません。

これは、Javascript が数値と文字列の違いについて非常に緩いという事実によるものと思われます。2 つの数値についてどうすればよいかわからない場合 (そのうちの 1 つが文字列のように見えるため)、加算ではなく連結。言い換えれば、JSを混乱させるのではなく、newMin値を渡すことによって。'-10'-10

簡単な例として、

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ように見える場合があります。次に を実行すると、Javascript は文字列をマイナス記号まで静かに処理し、式を評価して.6-10-4parseFloat6-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 に答える