Нужно написать метод, который получает на вход 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 уже.
Может кто подскажет как доделать эту задачу?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Моя задача: спарсить JSON из интернета, положить их в SQLite (это я сделал), но я сохранил только пути к изображению, но не сами изображенияМне нужно...
Не могу разобраться, как вызвать диалог, подобный этому https://wwwprimefaces
Довольно часто вижу в различных статьях использование XML вместе с JavaКакую роль он выполняет и как с ним взаимодействовать?