2011-09-08 180 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);