2011-09-08 178 views
2

我想獲得用戶輸入字符串的標準偏差。我有如下,但它爲SD返回錯誤的值。計算應該如下: 薩姆值/數值=平均 廣場(總結每個值均值) 薩姆squuares /數值。讚賞標準偏差javascript

援助(和解釋如果可能的話):

<html> 
<head> 
<script type='text/javascript'> 
    function sum(){ 
    var val = document.getElementById('userInput').value; 
    var temp = val.split(" "); 

var total = 0; 
var v; 

    for(var i = 0; i < temp.length; i++) { 
     v = parseFloat(temp[i]); 
     total += v; 
    } 

var mean=total/temp.length; 

var total1= 0; 
var v1; 

for(var i = 0; i < temp.length; i++) { 
     v1 = parseFloat(Math.pow(temp[i]-mean),2); 
total1 += v1; 
    } 


var temp23= total1/temp1.length; 
var square = Math.sqrt(temp23); 

document.write(total+'<br />'); 
document.write(mean+'<br />'); 
document.write(square); 

    } 

</script> 
</head> 
<body> 
<form id="input"> 
    <textarea id="userInput" rows=20 cols=20></textarea> 
    <input id="Run" type=Button value="run" onClick="sum()" /> 
</form> 


</body> 
</html> 
+0

字符串沒有一個標準偏差。你的意思是包含在字符串中的一系列數字的標準偏差嗎? – nnnnnn

回答

4

我認爲(主)的問題是在這條線:

v1 = parseFloat(Math.pow(temp[i]-mean),2); 

應該是:

v1 = Math.pow(parseFloat(temp[i])-mean),2); 

你代碼試圖使用temp[i]中的字符串作爲數字,並從中減去mean它,然後將其平方,然後解析結果值。需要解析浮動之前在計算中使用它。 Math.pow調用的關閉方式以外也有,2,所以平方也不起作用。

將有助於太使用更有意義的變量名,我的意思是,例如,你有一個名爲「廣場」變量保存平方根運算的結果。

P.S.您需要添加一些錯誤檢查,以防用戶輸入非數字數據。檢查parseFloat()的結果不是NaN。我傾向於通過數組解析並檢查有效數字來執行初始循環,將解析的數字存儲在第二個數組中(或將它們寫回第一個數組),並且如果有任何數據是無效的,則爲用戶提供錯誤消息在那一刻停下來。然後在你的實際計算中,你不必擔心解析(或者在你的情況下,再次在第二個循環中解析)。

+0

謝謝,工作 - 也有一個變量名爲temp1(未定義) – tc03

1

爲尋找一個更通用的解決方案,下面是添加到Array#標準偏差功能。該函數期望在數組數組上被調用。

Array.prototype.stanDeviate = function(){ 
    var i,j,total = 0, mean = 0, diffSqredArr = []; 
    for(i=0;i<this.length;i+=1){ 
     total+=this[i]; 
    } 
    mean = total/this.length; 
    for(j=0;j<this.length;j+=1){ 
     diffSqredArr.push(Math.pow((this[j]-mean),2)); 
    } 
    return (Math.sqrt(diffSqredArr.reduce(function(firstEl, nextEl){ 
      return firstEl + nextEl; 
      })/this.length)); 
}; 
-1

cssimek解決方案的Ramda.js版本如何?

function stdDev(xs) { 
    var square = R.curry(Math.pow)(R.__, 2); 
    var squaredDiff = R.compose(square, R.subtract(R.__, R.mean(xs))); 
    var variance = R.sum(R.map(squaredDiff, xs))/R.length(xs); 
    return Math.sqrt(variance); 
} 
1

function StandardDeviation(numbersArr) { 
 
    //--CALCULATE AVAREGE-- 
 
    var total = 0; 
 
    for(var key in numbersArr) 
 
     total += numbersArr[key]; 
 
    var meanVal = total/numbersArr.length; 
 
    //--CALCULATE AVAREGE-- 
 
    
 
    //--CALCULATE STANDARD DEVIATION-- 
 
    var SDprep = 0; 
 
    for(var key in numbersArr) 
 
     SDprep += Math.pow((parseFloat(numbersArr[key]) - meanVal),2); 
 
    var SDresult = Math.sqrt(SDprep/numbersArr.length); 
 
    //--CALCULATE STANDARD DEVIATION-- 
 
    alert(SDresult); 
 
    
 
} 
 

 
var numbersArr = [10, 11, 12, 13, 14]; 
 
StandardDeviation(numbersArr);