可能丢失精度错误Java

时间:2012-02-18 06:04:04

标签: java precision

快速提问,我发现答案接近于此,但没有任何帮助我。我希望它在小数点后面有4个数字的代码末尾打印一个百分比,当然,使用int工作。但是使用浮点数会给我一个错误。

此代码:

import java.util.Scanner;

public class HW2johnson_pp4 {
    public static void main(String args[]) {

        Scanner keyboard = new Scanner(System.in);
        System.out.printf("How many numbers will you enter?\n");
        float[] numbers = new float[keyboard.nextFloat()];

        System.out.printf("Enter " + numbers.length + " integers, one per line:\n");

        for (int i = 0; i <= numbers.length - 1; i++) {
            numbers[i] = keyboard.nextInt();
        }

        float sum = 0;
        for (int i = 0; i <= numbers.length - 1; i++) {
            sum += numbers[i];

        }

        System.out.printf("The sum is " + sum + "\n");

        System.out.printf("The numbers are:\n");

        for (int i = 0; i <= numbers.length - 1; i++) {
            float perc = (numbers[i] / sum);
            float perct = (perc * 100);
            System.out.printf(numbers[i] + " which is " + perct + "%% of the sum.\n");
        }
    }
}

给出错误:

HW2johnson_pp4.java:8: possible loss of precision
found   : float
required: int
        float[] numbers = new float[keyboard.nextFloat()];

4 个答案:

答案 0 :(得分:7)

您无法创建 length 是浮点值的浮点数组。也就是说,你不能拥有2.7个元素的数组。

因此,length参数中的float会变圆,导致精度损失。

您希望第8行有keyboard.nextInt(),第13行有keyboard.nextFloat()

答案 1 :(得分:2)

您无法使用浮点值初始化数组。

float[] a = new float[4]

而不是

float[] a = new float[4.0]

所以,问题在于:

float[] numbers = new float[keyboard.nextFloat()];

改为使用keyboard.nextInt()。

答案 2 :(得分:1)

您正在使用keyboard.nextFloat()(浮点数)作为数组numbers的长度。数组的长度必须是int。

答案 3 :(得分:1)

这是因为在第8行你正在创建一个新数组,并传递一个浮点作为长度。由于所有数组都需要一个整数作为数组长度,因此它会将float转换为整数,并给出错误。您想传入一个整数值。