我正在迭代一个int数组来查找中位数,然后返回中位数,这部分程序似乎有效。
但是,中位数必须转换为double
且它显示小数位但是它没有产生正确的输出,为什么?
import java.util.*;
public class Example
{
public static void main(String[] args)
{
int[] exampleArray = {2, 5, 10, 19, 23, 34};
System.out.println("Median is: " + findMedian(exampleArray));
// The output produced here should be 14.5 not 14.0
}
public static double findMedian(final int[] tempArray)
{
int median = 0,
Index = tempArray.length / 2;
if(tempArray.length % 2 == 1)
{
median = tempArray[Index];
/* I believe the problem is breaking down here I can't cast Index or
the tempArray to a double. I can copy the array elements into a new double array
but I tried that as well and the output was still off.
*/
}
else
median = (tempArray[Index] + tempArray[Index - 1]) / 2;
return (double)median;
}
}
答案 0 :(得分:1)
如您所料,您的问题在于
行median = (tempArray[Index] + tempArray[Index - 1]) / 2;
这一行正在进行整数除法。整数除法是将整数除以另一个整数时发生的事情,并且它将结果置于底层,因此5/2为2,即使5.0 / 2.0为2.5。
你需要像
这样的一行double preciseMedian = (tempArray[Index] + tempArray[Index - 1]) / 2.0;
小数点使2.0为双精度,这使整个除法发生在小数位。然后你需要将它存储在double变量中,因为你无法将它放在int中。
答案 1 :(得分:0)
你的索引应该是int。
double median = 0;
int Index = tempArray.length / 2; //should be int
if(tempArray.length % 2 == 1)
{
median = tempArray[Index];
/* I believe the problem is breaking down here I can't cast Index or
the tempArray to a double. I can copy the array elements into a new double array
but I tried that as well and the output was still off.
*/
}
else
median = (tempArray[Index] + tempArray[Index - 1]) / 2.0;
答案 2 :(得分:0)
问题是你已经将中位数声明为int并对int执行计算并将其存储回int。现在精度丢失了,然后转换为双精度,但没有恢复精度,所以改变代码的这些部分。
double median = 0;
median = ((double)tempArray[Index] + (double)tempArray[Index - 1]) / 2;
答案 3 :(得分:0)
您可能会将中位数的数据类型更改为double,并确保您正在进行双值的除法,如下所示:
double median = 0;
Index = tempArray.length / 2;
if(tempArray.length % 2 == 1)
{
median = tempArray[Index];
}
else
{
/* You're having an integer division here. That means it's just
cutting off the digits. A later cast from int to double would do
nothing. There were no digits before.
*/
median = (double)(tempArray[Index] + tempArray[Index - 1]) / 2;
}
return median;
}
答案 4 :(得分:0)
您的问题是这行代码:median = (tempArray[Index] + tempArray[Index - 1]) / 2;
。
您的median
变量是int
,并且您正在尝试为其分配一个double,因此java只是要移除表达式的浮动部分并为您提供一个int 。
这一行:return (double)median;
返回你的整数变量(删除了浮点的中间变量)为double,所以它不返回double,而是返回一个浮点整数点(.0)。
解决方案:
将int median = 0;
更改为double median = 0.0;
。这将保持浮点。
答案 5 :(得分:0)
尝试将中位数声明为双倍。
double median = 0;
答案 6 :(得分:0)
在Java 8+中,您可以使用IntSummaryStatistics
之类的
System.out.println(IntStream.of(exampleArray).summaryStatistics().getAverage());
在早期版本的Java中,我看到的最简单的解决方案是对元素求和,然后将总数除以元素数(即中位数),如
public static double findMedian(final int[] tempArray) {
long total = 0;
for (int val : tempArray) {
total += val;
}
return (double) total / tempArray.length;
}