我正在尝试编写一个程序来计算加权中位数,但是我有一个小问题无法解决。 要找到加权中位数,您必须将每个权重除以总和,然后将其与0.5进行比较,如果更大则意味着找到的加权中位数,然后返回相应的x值。 这里是一个例子:
x = [3,4,6,10]
w = [1,2,3,5]
1/11 > 1/2 ? no
1/11+ 2/11 > 1/2 ? no
1/11+ 2/11 + 3/11 > 1/2 ? yes
然后返回6,因为它对应于3
这是我的尝试:
public static void main(String[] args) {
int[] x = new int[] {3,4,6,10};
int[] w = new int[] {1,2,3,5};
int sum = Arrays.stream(w).sum();//11
if ((w[0]/sum)>0.5){
System.out.print("The weighted meadin is " + x[0]);
}
else if ((w[0]/sum)+(w[1]/sum)>0.5){
System.out.print("The weighted meadin is " + x[1]);
}
else if ((w[0]/sum)+(w[1]/sum)+(w[2]/sum)>0.5){
System.out.print("The weighted meadin is " + x[2]);
}
else if ((w[0]/sum)+(w[1]/sum)+(w[2]/sum)+(w[3]/sum)>0.5){
System.out.print("The weighted meadin is " + x[3]);
}
else{
System.out.print("The weighted meadin not found");
}
}
这总是返回last else语句。
答案 0 :(得分:1)
sum
数组和int
变量中的元素都是/
,因此,当执行0
操作时,实际上是在执行{{3} }-也就是说,您仅保留除法的“整个”部分,在这种情况下,该部分始终为double
。
将其中一个操作数定义为double sum = Arrays.stream(w).sum();
将使Java使用浮点除法并解决您的问题。例如:
openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof
答案 1 :(得分:0)
您使用的每个除法运算都是整数除法,因为两个操作数都是整数。
尝试使其成为浮点除法。
一种方法是例如将每个w[0] / sum
等重写为w[0] * 1.0 / sum
。
另一个方法是将sum
变量声明为double
。