循环中的数组可能会丢失精度错误

时间:2014-07-27 21:16:49

标签: arrays precision

所以我在一些程序中不断出现与此类似的错误,我无法弄明白。循环中的数组和所有变量都是双精度的,所以我不知道为什么它需要一个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

2 个答案:

答案 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}}您可能会丢失一些数据。