所以我在一些程序中不断出现与此类似的错误,我无法弄明白。循环中的数组和所有变量都是双精度的,所以我不知道为什么它需要一个int值。无论如何,所有的错误都引用了最后一个块中的for语句:
import java.util.Scanner;
public class Exercise610
{ public static void main (String[] args)
{
int smallest;
Scanner stdIn = new Scanner (System.in);
double array1 [] = new double [100];
for (int i=0; array1[i] != -7; i++)
{
System.out.println("Input a value in yer string, or -7 to end");
array1[i] = stdIn.nextDouble();
}
smallest = indexOfSmallestElement(array1);
System.out.println("The smallest value in the array is " + smallest);
}
public static int indexOfSmallestElement (double[] array)
{
int smallestInt;
double smallest = array[0];
for (double u: array)
{
if (array[u+1] < array[u])
{
smallest = array[u+1];
}
}
smallestInt = (int) smallest;
return smallestInt;
}
}
文件:/Users/Crbn/introcs/Exercise610.java [line:33]
错误: /Users/Crbn/introcs/Exercise610.java:33:可能会丢失 精度
发现:double
required:int
文件: /Users/Crbn/introcs/Exercise610.java [line:33]
错误: /Users/Crbn/introcs/Exercise610.java:33:可能会丢失 精度
发现:double
required:int
文件: /Users/Crbn/introcs/Exercise610.java [line:35]
错误: /Users/Crbn/introcs/Exercise610.java:35:可能会丢失 精度
发现:double
required:int
答案 0 :(得分:4)
我不熟悉Java,但我认为这可能与此行smallestInt = (int) smallest;
有关 - 基本上它让你知道向double
投射int
将导致数据丢失。
我怀疑你的方法命名错误或编码错误,方法名称表明你应该返回索引,而不是值。
smallest = array[u+1];
正在分配数组值,而不是数组索引 - 这实际上可能是您的问题,您可能需要smallest = u + 1;
给定方法名称。
答案 1 :(得分:4)
你不能说array[u+1]
因为它指的是数组的索引。错误是因为u
是 double ,并且任何数组中的索引都是0,1,2等整数中的数字...
您应该使用如下的整数遍历数组:
for (int i = 0; i < something; i++){
// do something here
}
如果需要,可以将u
转换为int(请参阅下面的代码),但最好先将其声明为int
。
for (double u : array) {
if (array[(int) (u + 1)] < array[(int) u]) {
smallest = array[(int) (u + 1)];
}
}
精度错误丢失的原因是int
占用32位内存,double
占用64位,所以如果你试图将double
压缩成{ {1}}您可能会丢失一些数据。