2013-03-06 109 views
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

我已盡我所能在this site上找到答案。然而,提問的人沒有提到他最終做了什麼來解決問題。這個問題說它可能與混合數據類型有關,但我將所有東西都轉換爲浮點數,我錯過了什麼?

+1

我不會在參數值上使用'!='。做'!=='。 – 2013-03-06 17:44:55

+0

首先刪除'parseFloat'。 JavaScript只知道「數字」,沒有「int」或「float」。 – kay 2013-03-06 17:45:33

+0

範圍(0 - > 20) - 10? – 2013-03-06 17:46:14

回答

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,舉一個例子。然後當你做了一個parseFloat時,Javascript會悄悄地通過字符串直到減號,並返回6而不是評估表達式並提出-4

要清理混亂,由1乘以每個參數,使其「一個真正的數字」:

oldMin = 1*oldMin; 
oldMax = 1*oldMax; 
newMin = 1*newMin; 
newMax = 1*newMax; 
oldValue = 1*oldValue; 

當你在你的函數聲明的開頭添加這些行,一切工作順利 - 不管你如何調用這個函數。或者只是將它的值稱爲不在引號中 - 這是在這個特定情況下造成麻煩的人。

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 

我希望這說明了問題的原因,以及解決方案。

+0

噢,我的上帝是一個多麼愚蠢的小錯誤,但是謝謝你幫助我,指出問題如此之好,我現在完全明白了。 我通過將每個變量與1相乘來修正了我的功能,因此用戶使用引號或不使用012來調用函數並不重要 – 2013-03-07 08:57:22

+0

很高興喜歡答案。你知道如何「接受」它嗎? – Floris 2013-03-07 13:12:28

+0

不,我不喜歡:你的意思是像點擊某處,以確認我的問題解決? – 2013-03-08 07:09:39