我正在尝试获取用户输入字符串的标准差。如下所示,但它返回了错误的SD值。计算方法如下:求和值/数值=均方(求和每个值-均值)求和平方/数值。
感谢帮助(如果可能,请解释):
function sum() {
var val = document.getElementById('userInput').value;
var temp = val.split(" ");
var total = 0;
var v;
var mean = total / temp.length;
var total1 = 0;
var v1;
var temp23;
var square;
for (var i = 0; i < temp.length; i++) {
v = parseFloat(temp[i]);
total += v;
}
mean = total / temp.length;
for (var i = 0; i < temp.length; i++) {
v1 = parseFloat(Math.pow(temp[i] - mean), 2);
total1 += v1;
}
temp23 = total1 / temp.length;
square = Math.sqrt(temp23);
document.write(total + '<br />');
document.write(mean + '<br />');
document.write(square);
}<html>
<head>
</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>
发布于 2011-09-08 14:31:06
我认为(主要)问题在下面这一行:
v1 = parseFloat(Math.pow(temp[i]-mean),2);应该是:
v1 = Math.pow(parseFloat(temp[i])-mean),2);您的代码尝试将temp[i]中的字符串用作数字并从中减去mean,然后将其平方,然后解析结果值。在计算中使用它之前,需要使用parseFloat。另外,在Math.pow调用的结束括号之外还有,2,所以平方也不起作用。
使用更有意义的变量名也是有帮助的,我的意思是,例如,你有一个名为"square“的变量,它保存平方根运算的结果。
附注:您需要添加一些错误检查,以防用户输入非数字数据。检查parseFloat()的结果是否不是NaN。我倾向于在数组中执行初始循环,解析和检查有效数字,将解析的数字存储在第二个数组中(或将它们写回第一个数组),如果有无效的,则在该点给用户一条错误消息并停止。然后,在实际计算中,您不必担心在执行过程中进行解析(或者,在您的情况下,在第二个循环中再次解析)。
发布于 2018-12-02 11:39:13
如果你不喜欢很多代码,从数组中获取标准差的简写方法:
function getStandardDeviation (array) {
const n = array.length
const mean = array.reduce((a, b) => a + b) / n
return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n)
}发布于 2015-08-25 18:19:10
对于任何寻求更通用解决方案的人,这里有一个添加到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));
};https://stackoverflow.com/questions/7343890
复制相似问题