首页 > 解决方案 > Android Studio:来自 org.apache.commons.math4.stat.descriptive 的 getStandardDeviation() 方法没有给我 Std 的确切值

问题描述

我想知道是否有人可以帮助我一点。我正在开发一个从双值列表中提取平均值和标准差的程序。我使用 org.apache.commons.math4.stat.descriptive 来执行此操作,该库有一个名为 GetStandardDeviation() 的方法,它为您提供列表的标准,但是当我手动计算此标准时,我没有得到与方法相同的值返回我。这是我的代码:

public class PDC extends AppCompatActivity {

private DescriptiveStatistics stats = new DescriptiveStatistics();

private double media;
private double dvt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pdc);

    double K = 0.00;

    Bundle extras;

    extras = getIntent().getExtras();
    assert extras != null;

    String nombrelista = extras.getString("nombrelista");
    ArrayList<String> listDatos = extras.getStringArrayList("listDatos");

    assert listDatos != null;

    if(listDatos.size()==9){ K = 1.92;}
    if(listDatos.size()==10){K = 1.96;}
    if(listDatos.size()==11){K = 2.00;}
    if(listDatos.size()==12){K = 2.04;}
    if(listDatos.size()==13){K = 2.07;}
    if(listDatos.size()==14){K = 2.10;}

    //This for parses to double the positions from listdatos Arraylist and put it in the DescriptiveStatistics type variable called "stats"

    for (int i = 0; i < listDatos.size(); i++) {
        stats.addValue(Double.parseDouble(listDatos.get(i)));
    }

    // so now, when i have my arraylist saved in "stats" i call getStandardDeviation

    media = stats.getMean();
    dvt = stats.getStandardDeviation();

    int numeroMed = listDatos.size();

    double imin = media - (K * dvt);
    double imax = media + (K * dvt);

    //then i pass all the values to another activity where it shows up in a TextView Field

    Intent A = new Intent(this, Resultados.class);
    A.putExtra("nombreLista", nombrelista);
    A.putExtra("NumeroMedidas", numeroMed);
    A.putStringArrayListExtra("listDatos", listDatos);
    A.putExtra("Media", media);
    A.putExtra("dvt", dvt);
    A.putExtra("Imin", imin);
    A.putExtra("Imax", imax);
    A.putExtra("K",K);
    startActivity(A);
}
} 

我不确定为什么它不起作用。也许我在通过活动时丢失了一些信息,因为这些值曾经是非常长的数字。

¿ 如果我不使用这个库并设计我自己的方法来做标准偏差会更好吗?

另外,如果您在我的代码中看到要改进的地方,请告诉我,我真的很感激它,因为我对此很陌生。太感谢了!

标签: javaandroidandroid-studiostandard-deviationapache-commons-math

解决方案


这是 Java 中的精度损失。

可以使用 strictfp 来修改 onCreate 方法,或者把 double 放到 BigDecimal 就可以解决这个问题


推荐阅读