Задача на округление чисел в Java

486
20 сентября 2017, 10:56

Нужно написать метод, который получает на вход 4 дробных положительных числа, сумма которых является целым числом, а возвращает 4 целых числа с сохранением суммы. При этом числа могут быть любой точности. Целые числа на выходе являются результатом округления дробных, а значит не должны отличаться от соответствующих входных чисел больше чем на 1 в ту или иную сторону.

Пример входных данных:

2,478
5,761
1,923
9,838
20

Пример выходных данных:

2
6
2
10
20

public class JavaApplication2 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    double i[] = { 2.5, 5.5, 1.003, 9.997};
    Index(i);
}
public static void Index(double[] a){
    int count = 0;
    System.out.println("Числа на входе:");
    for (int i = 0; i < a.length; i++){
        System.out.println(a[i]);
    }
    //вычисляем сколько чисел с *.5
    for (int i = 0; i < a.length; i++){
        if(a[i] - (int)a[i] == 0.5){
            count++;
        }
    }
    MathOp.SumAndRound(a, count);
}
public static class MathOp{
    public static void SumAndRound(double[] b, int cnt){
        ArrayList<Double> list = new ArrayList<>();
        double sumDouble = 0;
        int sumInt = 0;
        //вычислие суммы дробных
        for(int i = 0; i < b.length; i++){
            sumDouble += b[i];  
        } 
        //возвращает целое число, ближайшее к аргументу - стандартный метод
        if(cnt == 0){
            for (int i = 0; i < b.length; i++){
                b[i] = Math.round(b[i]);
                list.add(b[i]);
            }  
        } 
        //если есть числа с *.5, то округляем в большую и в меньшую 
        // через одно число. Условие соблюдаем - числа не больше чем на 1 в ту или 
        //другую сторону
        else if(cnt > 0){
            //если дробное число *.0, то без округления
            for(int i = 0; i < b.length; i++){
                if(b[i] - (int)b[i] == 0.0){
                    list.add(b[i]);
                }
            }
            int count = 0;
            for (int i = 0; i < b.length; i++){
                //если нет *.5 и число еще не округлено, то округляем его 
                // обычным способом
                if (b[i] - (int)b[i] != 0.5 && b[i] - (int)b[i] != 0.0){
                    b[i] = Math.round(b[i]);
                    list.add(b[i]);
                }
                if (b[i] - (int)b[i] == 0.5 && count == 0){
                    count++;
                    b[i] = Math.floor(b[i]);
                    list.add(b[i]); 
                }
                if(b[i] - (int)b[i] == 0.5 && count == 1){
                    count++;
                    b[i] = Math.ceil(b[i]);
                    list.add(b[i]);  
                }
                if (b[i] - (int)b[i] == 0.5 && count == 2){
                    count++;
                    b[i] = Math.floor(b[i]);
                    list.add(b[i]);
                }
                if (b[i] - (int)b[i] == 0.5 && count == 3){
                    count++;
                    b[i] = Math.ceil(b[i]);
                    list.add(b[i]);
                }
                if (b[i] - (int)b[i] == 0.5 && count == 4){
                    count++;
                    b[i] = Math.floor(b[i]);
                    list.add(b[i]);
                }
            }
        }
        double[] e = list.stream().mapToDouble(Double::doubleValue).toArray();
        System.out.println("Округлённые числа:");
        for(int i  = 0; i<e.length; i++){
            System.out.println(e[i]);
        }
        //сумма округлённых
        for(int i = 0; i < e.length; i++){
            sumInt += e[i];  
        }
        System.out.println("Сумма дробных: " + (int)sumDouble);
        System.out.println("Сумма округленных: " + sumInt);
        Equals((int)sumDouble,sumInt);
    }
    public static void Equals(int sumDouble, int sumInt){
       if(sumDouble == sumInt){
           System.out.println("Числа ровны");
       }
       else if(sumDouble < sumInt){
           System.out.println("Дробные меньше");
       }
       else if(sumDouble > sumInt){
           System.out.println("Дробные больше");
       }
       else System.out.println("Что-то пошло не так...");
    }
}

}

Проблема состоит в том, что если числа к примеру все с .9 (девять десятых), то суммы сильно разнятся. Бьюсь часа 4 уже.

Может кто подскажет как доделать эту задачу?

READ ALSO
Как скачивать и сохранять изображения в память телефона?

Как скачивать и сохранять изображения в память телефона?

Моя задача: спарсить JSON из интернета, положить их в SQLite (это я сделал), но я сохранил только пути к изображению, но не сами изображенияМне нужно...

260
Как JSF (Primefaces) вызвать диалог по нажатию на кнопку

Как JSF (Primefaces) вызвать диалог по нажатию на кнопку

Не могу разобраться, как вызвать диалог, подобный этому https://wwwprimefaces

328
XML (FXML) и Java [требует правки]

XML (FXML) и Java [требует правки]

Довольно часто вижу в различных статьях использование XML вместе с JavaКакую роль он выполняет и как с ним взаимодействовать?

357
На верном ли я пути к Android Junior&#39;у? [требует правки]

На верном ли я пути к Android Junior'у? [требует правки]

Пример последнего приложения: тык

302