Как мне вывести значение 'а' из цикла
Я хочу сделать код высчитывающий проценты. Но мне не удаётся вернуть изменённое значение из цикла
package ILBC;
import java.util.Scanner;
public class Percents {
public static double Percentage (double Money, double YearPercent, double Years) {
double a = 0;
for (int i = 0; i == Years; i++) {
a += (Money * (YearPercent / 100));
}
return a;
}
public static void main(String[] args) {
Scanner cs = new Scanner(System.in);
System.out.println("Сумма");
double Money = cs.nextDouble();
System.out.println("Время (сколько лет)");
double Years = cs.nextDouble();
System.out.println("Годовой процент");
double YearPercent = cs.nextDouble();
cs.close();
System.out.println(Percentage(Money, YearPercent, Years));
}
}
Ответы (1 шт):
Во-первых, в коде есть опечатка в условии цикла i == Years
, из-за которой цикл не выполняет ни одной итерации, и соответственно метод всегда возвращает значение 0
.
Во-вторых, даже если исправить эту опечатку, чтобы проверялось условие i < Years
, вычисления останутся неправильными.
Например, при вводе дробных значений Years
всегда будет начисляться процент за полный год, когда реально останется меньше года.
В-третьих, в представленном коде не вычисляется сложный процент, т.е. не происходит капитализация процентов (они не прибавляются к основной сумме), поэтому цикл для таких вычислений вообще не нужен, достаточно было бы вернуть результат простого умножения: Money * YearPercent * Years / 100
.
Для вычисления сложного процента с учётом капитализации процентов в конце каждой итерации следовало бы прибавить к Money
накопленный процент.
В-четвертых, для финансовых вычислений используется неподходящий тип данных с плавающей точкой, из-за чего могут возникнуть ошибки округления.
Вариант исправленного кода:
public static double totalRevenue(double amount, double interestRate, double years) {
double total = 0;
interestRate /= 100;
while (years > 0) {
double revenue = Math.round(amount * interestRate * Math.min(1, years) * 100) / 100d;
total = Math.round(100 * (total + revenue)) / 100d;
amount = Math.round(100 * (amount + revenue)) / 100d;
years -= 1;
}
return total;
}