2013-03-05 57 views
0

我的标准偏差是失败的。当我输入: 2 4 4 4 5 5 7 9 n代码中的Java编程标准偏差错误

我没有得到2.这是我的代码。我相信一切正常,所以我不明白为什么我总是收到1.8284791953425266而不是2:

import java.util.Scanner; 

public class stocks { 

    public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 
    double currentNum = 0; 
    double numtotal = 0; 
    int count = 0; 
    double mean = 0; 
    double square = 0, squaretotal = 0, sd = 0; 

    System.out.println("Enter a series of double value numbers, "); 
    System.out.println("Enter anything other than a number to quit: "); 

    while (in.hasNextDouble()) 
    { 

     currentNum = in.nextDouble(); 
     numtotal = numtotal + currentNum; 

     count++; 
     mean = (double) numtotal/count; 
     square = Math.pow(currentNum - mean, 2.0); 
     squaretotal = squaretotal + square; 
     sd = Math.pow(squaretotal/count, 1/2.0); 
    } 

    System.out.println("The mean is: " +mean); 
    System.out.println("The standard deviation is: " +sd); 

    } 


} 
+1

[该组的标准偏差为2.13,实际](http://www.wolframalpha.com/input/?i=Standard+deviation%3A+ %7B2 + 4 + 4 + 4 + 5 + 5 + 7 + 9%7D) – Makoto 2013-03-05 05:03:05

+0

我使用这个定义:http://en.wikipedia.org/wiki/Standard_deviation所以我除以n不是(n -1)在平方根符号 – LorrJ 2013-03-05 05:05:47

回答

2

你需要计算出的平均值为所有的号码,你制定出标准偏差之前。 现在你的意思是所有数字的平均值,直到当前的数字。你的问题在这里

square = Math.pow(currentNum - mean, 2.0); 

在这一点上,平均值是我们所看到的数字的平均值。这是因为numtotal是我们所看到的数字的总和。为了解决这个问题,你可以先把所有的数字放入数组列表中。然后找出所有数字的均值,之后可以计算出方差和标准偏差。

+0

如果需要,这几乎可以作为递归树系统来完成:avg(avg(a,b),avg(c,d))=(a + b + c + d)/4' – 2013-03-05 05:10:09

+0

另外,如果我能够如此直言不讳地表明他在哪里搞砸了,那会很棒。通过计算平均值来计算平均数,可以带来独特的进步。假设我们声明:'d = avg(a,b)',按照这个标准,将'c'加入到平均数中,我们必须这样做:'e =(d * 2 + c)/ 3'。这可以表示为公式:'avg = avg(nums [])/ nums.length + next'。如果你做了一个系列扩展,你会意识到你最终除以2,然后乘以2等等。常见的误解。 – 2013-03-05 05:15:08

+0

@Legend我认为这不是问题。问题在于每个数字和平均数之间的平方差是用我们迄今为止看到的数字的均值来计算的,而不是最终的均值。平均值本身在循环结束时很好。 – 2013-03-05 14:06:53

0

count如果您打算除以它,则需要双倍。

mean = (double) numtotal/count; 

- >

mean = (double) numtotal/(double) count; 
+0

前段时间我写了一些关于基本数据类型介绍的文章,我认为它可能适用于这里:双重类型就像病毒,所有其他类型在执行操作时成为双精度。另外,从double转换为任何其他类型需要'(double)'强制转换。 – 2013-03-05 15:55:12