在 Java 中计算一个 Phi 系数

Calculate a Phi coefficient in Java

我想为混淆矩阵 2 x 2 计算 Java 中的 Phi 系数 到目前为止的代码如下:

double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
               double output= Math.sqrt(str);
                if (output!= 0.0)
                return (trueP * trueN) / output;
            else return 0.0;

其中 trueP=6930trueN=6924falseP=0 和 falseN = 0,这段代码的输出是3629.03401901938。 我计算了 excel 中的 Phi 系数,它 returns 值 1 相同的值

哪里错了?

任何帮助将不胜感激

我可以重现此错误,但前提是 truePtrueNfalsePfalseNint

如果是int,那么这一行就溢出了int的范围,才可以赋值给double.

double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);

这个值只有1.74822976E8,应该是2.3023989982224E15,比Integer.MAX_VALUE大,比20亿多一点(2E9)。

将第一个值转换为 double 以强制对整个表达式进行浮点运算,因为 double 的有效值范围更大。

double str= ( (double) trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);

当我这样做时,我得到了你想要的输出1.0

为确保整个计算有效,对所有 4 个变量使用 doubletruePtrueNfalsePfalseN

如果每个变量都是双倍的,您的代码会产生所需的输出 1.0 :

只需编译和运行下面的java class,它将您想要分配的值分配给 trueP、trueN、falseP 和 falseN:

class confusion {
    public static void main(String[] args) {
    double trueP=6930;
    double trueN=6924;
    double falseP=0;
    double falseN=0;
    double str= (trueP + falseP) *(trueP + falseN) * (trueN + falseP) * (trueN + falseN);
               double output= Math.sqrt(str);
                if (output!= 0.0) {
                    double output2 =(trueP * trueN) / output;
                    System.out.println(output2);
            }
                else  {
                System.out.println(output); // Display the string.
            }
    }
}

原因是 double 可以为您的情况提供足够大的最大值:

static double   MAX_VALUE
A constant holding the largest positive finite value of type double, (2-2-52)·21023.

如您所见:http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html