Java 使用do-while循环计算平均值和标准偏差

Java 使用do-while循环计算平均值和标准偏差,java,Java,我试图编写一个程序,要求用户输入一系列正值,并计算这些值的平均值和标准偏差,当用户输入-1时,输入停止。然而,我似乎已经把平均分降低了。我似乎无法得到标准偏差 到目前为止,这就是我所拥有的 import java.util.Scanner; public class HW0402 { public static void main(String[] args) { Scanner input = new Scanner(System.in);

我试图编写一个程序,要求用户输入一系列正值,并计算这些值的平均值和标准偏差,当用户输入-1时,输入停止。然而,我似乎已经把平均分降低了。我似乎无法得到标准偏差

到目前为止,这就是我所拥有的

import java.util.Scanner;

public class HW0402

{

    public static void main(String[] args) 
    {
        Scanner input = new Scanner(System.in);



        double x;

        double sum = 0;

        double average = 0;

        double dev = 0;

        double var = 0;

        double sqrx = 0;

        int n = 0;

        do 
        { 
            System.out.println("Enter positive values, enter -1 to end");
            x = input.nextInt(); 
            if (x == -1)
            {
                break;
            }

            sum += x;
            n++;
            average = sum / n;      
            sqrx += Math.pow(x-average,2);
            var = sqrx / (n-1);
            dev = Math.sqrt(var);


        } while (x != -1);

        System.out.println("Average: " + average);
        System.out.println("Deviation: " + dev);

    }
}
当简单地计算sqrx+=x-平均值时,我似乎会得到一些奇怪的结果,比如小数

我是java新手,还没有学习过解决这个问题的其他方法,如果有人给我指出应该做什么的正确方向,或者解释我做错了什么,我会很高兴

为我犯的任何新手错误提前道歉

int n = 0;
int K = 0;
double Sum = 0;
double Sum_sqr = 0;
do { 
    System.out.println("Enter positive values, enter -1 to end");
    x = input.nextInt(); 
    if (x == -1)
    {
        break;
    }
    if ( n == 0 ) K = x;
    n++;
    Sum += (x - K);
    Sum_sqr += (x - K) * (x - K);
} while (x != -1);
double mean = K + Sum / n;
double varPop = (Sum_sqr - (Sum*Sum)/n) / (n);
double varSample = (Sum_sqr - (Sum*Sum)/n) / (n-1);
double devPop = Math.sqrt(varPop);
double devSample = Math.sqrt(varSample);

参考资料。此外,人口或样本也会产生影响。

你犯的错误与数学有关,而与编程无关。数据集的平均值随每个新输入而变化,但您每次都计算一个新的平均值,并将差值的平方添加到
sqrx
。这是错误的,因为每次使用的平均值不同。将这些操作移到循环的外部。事实上,您不应该在循环中进行任何计算,因为您不输出结果。只要把所有的数学移到循环之外,你就会得到正确的结果。Faraz我实际上不能引用链接的答案,因为我们还没有讨论数组@Arc676用于将数学移动到外部,我应该将其移动到哪里,移动什么行,因为我无法移动sum+=x,而不会得到错误的平均值输出。同样,对于原始代码,我的平均值是正确的,这意味着当你说我的平均值改变时,这会如何影响sqrx+=Math.pow(x-average)?代码工作正常,维基链接很棒,但是你能解释为什么sum和sum_sqr仍然在循环中,而mean、varpop、varsample等没有?它们在哪里可能并不重要。因为它们只需要计算一次,所以被保留在循环之外。换句话说,我用一个数组测试了它,我没有想到要打印出每个新数字的结果。一定要把它们包括在循环中。