我试图获得用户输入字符串的标准偏差。我有如下,但它返回错误的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>
答案 0 :(得分:5)
我认为(主要)问题出现在这一行:
v1 = parseFloat(Math.pow(temp[i]-mean),2);
应该是:
v1 = Math.pow(parseFloat(temp[i])-mean),2);
您的代码正在尝试将temp[i]
中的字符串用作数字并从中减去mean
,然后将其平方,然后解析结果值。在计算中使用它之前需要在之前使用parseFloat 。此外,,2
调用的结束时,Math.pow
还有parseFloat()
,因此平方也无法正常工作。
使用更有意义的变量名称也会有所帮助,我的意思是,例如,你有一个名为“square”的变量来保存平方根操作的结果。
P.S。如果用户输入非数字数据,您需要添加一些错误检查。检查NaN
的结果是否为{{1}}。我倾向于通过数组解析和检查有效数字进行初始循环,将解析后的数字存储在第二个数组中(或将它们写回第一个数组),如果有任何无效,则给用户一个错误消息在那一点上停下来。然后在实际计算中,您不必担心解析(或者,在您的情况下,在第二个循环中再次解析)。
答案 1 :(得分:3)
如果不喜欢很多代码,则可以从数组中获取标准差的速记方法:
n = array.length;
mean = array.reduce((a,b) => a+b)/n;
s = Math.sqrt(array.map(x => Math.pow(x-mean,2)).reduce((a,b) => a+b)/n);
答案 2 :(得分:2)
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);
&#13;
答案 3 :(得分:0)
标准偏差功能的快速实现:
const sd = numbers => {
const mean = numbers.reduce((acc, n) => acc + n) / numbers.length;
return Math.sqrt(
numbers.reduce((acc, n) => (n - mean) ** 2) / numbers.length
);
};
正确的SD版本:
const correctedSd = numbers => {
const mean = numbers.reduce((acc, n) => acc + n) / numbers.length;
return Math.sqrt(
numbers.reduce((acc, n) => (n - mean) ** 2) / (numbers.length - 1)
);
};
答案 4 :(得分:0)
此ES6实现与Excel的内置STDEV.P
和STDEV.S
相匹配(调用.S
时默认为STDEV
)。在此处传递true
的{{1}}标志将匹配Excel的usePopulation
STDEV.P
答案 5 :(得分:0)
标准偏差非常简单。
function standardDeviation(numArray) {
const mean = numArray.reduce((s, n) => s + n) / numArray.length;
const variance = numArray.reduce((s, n) => s + (n - mean) ** 2, 0) / numArray.length;
return Math.sqrt(variance);
}
如果你有一个字符串数组,记得先转换浮点数组array.map(s => parseFloat(s))
答案 6 :(得分:-1)
此函数起作用并产生与numjs相同的结果
const st = (numbers) => {
const mean = numbers.reduce((acc, item) => acc + item) / numbers.length;
return Math.sqrt(numbers.reduce((acc, item) => acc + Math.pow((parseFloat(item) -mean), 2)))
}