Как написать метод для расчета сложных процентов по годам?

#java

#java

Вопрос:

 public class Balance {
public static void main(String[] args) {
    System.out.printf("%.2fn", balance(0.0, 0.0, 0.0));
}
/**
 * @param principal
 * @param rate
 * @param years
 * @return
 */
public static double balance(double principal, double rate, double years) {
    double amount = 0;
    Scanner sc = new Scanner(System.in);

    System.out.print("Enter the initial investment amount: ");
    principal = sc.nextDouble();

    System.out.print("Enter the interest rate: ");
    rate = sc.nextDouble();

    System.out.print("Enter the number of years: ");
    years = sc.nextDouble();

    for (int i = 1; i < years; i  ) {
        amount = principal * Math.pow(1.0   rate, years);
        amount  = principal;
    }
    return amount - principal;

}
}
 

Моя проблема связана со строкой printf, которую я использую в основном методе. Eclipse хочет, чтобы я изменил баланс метода с void на Object[] . Когда я делаю это, я должен вернуть значение из баланса. Итак, я думаю, мой вопрос в том, как мне вернуть правильное значение? Я на правильном пути? Спасибо за ваше время и конструктивную критику. 🙂

РЕДАКТИРОВАТЬ — Спасибо всем за помощь, очень признателен 🙂 Моя математика отключена. В итоге у меня получается на 1000 больше, чем должно было быть. хммм.

Итак, я должен просто взять 1000 из суммы, например:

 return amount - 1000;
 

Или это:

 return amount - principal;
 

РЕДАКТИРОВАТЬ это то, что я собираюсь сделать, поскольку это должно произойти сегодня вечером. Спасибо всем за помощь. 🙂

Комментарии:

1. годами не касался java, но разве: ‘return amount;’ в методе баланса не должно быть тем, что вы ищете? и, конечно, изменение с void на double для определения метода. редактировать: при дальнейшем размышлении, что вы пытаетесь сделать? измените функцию так, чтобы выходные данные были отформатированы? Почему бы не изменить строку System.out.println(amount); на printf ?

Ответ №1:

Несколько моментов:

  • balance() не может быть пустым, потому что вы используете его возвращаемое значение в S.out.printf() . Вы хотите, чтобы баланс выводился на экран, или вы хотите, чтобы он выдавал число?
  • Ваш цикл for (years = 0; years > 10; years ) не будет выполняться. Подумайте, почему. Это может помочь преобразовать for в a while , чтобы визуализировать, почему.
  • Вы читаете в годах как a double , но затем используете его в качестве счетчика в своем цикле. Какой тип он должен быть на самом деле?
  • Ваша balance() функция принимает три параметра, затем немедленно получает входные данные и стирает их. Вы хотите balance() , чтобы вам были предоставлены эти числа, или вы хотите, чтобы он их извлекал?

В остальном вы, похоже, на правильном пути.

Ответ №2:

Проблема в том, что это balance ничего не возвращает (это void функция). Измените его на:

 public static double balance(double principal, double rate, double years) {
...
 

И внутри этой функции return баланс.

Java сообщает вам, что хочет Object[] , чтобы значение because printf определялось следующим образом:

 public static void printf(String format, Object ... params) {
    // params is an Object[]
}
 

Что это позволяет вам делать, так это передавать такие параметры:

 printf("some string", first, second, etc);
 

Это позволяет вам передавать столько параметров, сколько вы хотите, и функция может обрабатывать их, как если бы вы передавали массив.

Это точно так же, как если бы оно было определено следующим образом:

 public static void printf(String format, Object[] params);
 

И вы использовали его так:

 printf("some string", new Object[] { first, second, etc});
 

Это просто проще в использовании.

Редактировать:

Другой вариант — ничего не печатать main , но я бы определенно посоветовал вернуть результат и распечатать его main . Это следует принципу, чтобы каждая функция выполняла как можно меньше. balance следует просто рассчитать баланс. Его печать не связана.

Комментарии:

1. printf не требуется в main; метод баланса выводит сумму.

2. @duffymo — Отредактировано. Правильный ответ, я рекомендую против него (по причинам, изложенным выше).

Ответ №3:

Пожалуйста, подумайте о более радикальной переработке вашего кода; как бы то ни было, ваша balance() функция выполняет всю работу вашей программы (и ваша printf() строка кажется запоздалой). Если вы разделите свой код на части, основываясь на том, что делает код, я думаю, вы сможете сделать намного лучше:

  • создайте функцию, которая запрашивает пользователя, а затем считывает его входные данные
  • создайте функцию, которая вызывает предыдущую функцию три раза для основной суммы, ставки и года
  • создайте функцию, которая вычисляет и заполняет график платежей. Следите за годом, балансом, платежом, основной оплатой и выплатой процентов. (Или просто переменные, которые вас интересуют, но имейте в виду, что программы, как правило, расширяют новые функции, и эти переменные часто являются вторым, что пользователи (или преподаватели) просят знать при выплате кредита.)
  • создайте функцию, которая печатает выбранные столбцы из вашего графика платежей.
  • создайте функцию, которая организует предыдущие функции.

Когда вы перепишете свою программу для использования графического интерфейса пользователя или веб-сервиса за три недели, вы обязательно поблагодарите себя за то, что написали каждую функцию для выполнения одной задачи, и делаете это хорошо. Вы также обнаружите, что гораздо проще тестировать небольшие фрагменты кода, которые выполняют только одну задачу.

Существует риск чрезмерной разработки слишком общего решения — то, что я действительно пытаюсь предложить, — это функциональное разложение вашего кода на несколько более мелких подпрограмм, которые делают именно то, что говорит их название. Возможно, вы никогда не переведете программу в графический интерфейс, веб-сервис или что-то еще, но вы определенно будете счастливы, когда кто-нибудь сообщит, что ваш график амортизации неверен, что вы можете управлять им с помощью более простого программирования, вместо того, чтобы весь день заново вводить вводимые данные.

Комментарии:

1. Спасибо за информацию. Звучит как отличная идея, мне просто нужно закончить это до 11:55 вечера по тихоокеанскому времени. Могу ли я это сделать?

2. Являются ли функции и методы синонимами?

3. @elevent357, то, как я использую термины » функции и методы «, да. 🙂 Однако они не совсем одинаковы: методы связаны с классом (либо как метод класса, либо как метод объекта) — и поскольку Java заставляет все быть в классе, все функции являются методами в Java. Функция обычно зарезервирована для подпрограмм , которые возвращают значения. Но я привык называть их все функциями по привычке.

4. Что касается 11:55 вечера по тихоокеанскому времени, возможно, вам следует придерживаться своего первоначального курса действий — это хорошее начало. Разделение обязанностей, которое я предложил, стоит того, чтобы сделать, когда у вас есть немного свободного времени — время, сэкономленное на одних только процедурах тестирования, того стоит — но поскольку principal и rate есть double и years должно быть int , а расписание представляет собой более сложный многомерный массив разных типов, вероятно, его слишком много для обработкиза шесть часов, когда так много было бы нового. Но, пожалуйста, имейте в виду разделение вычислений и интерфейса для будущих проектов. 🙂

Ответ №4:

Ваш неверен, сделайте это:

 public static void main(String[] args) {
    balance(1000.0, .05, 8.5); 
}
 

Комментарии:

1. В этом нет ничего плохого. Это правильный синтаксис; баланс выводит сумму в цикле. В чем проблема? Я бы так не писал, но ответ действительно отвечает на вопрос.

2. Они не знают, как это сделать. Просто дать им ответ, даже не пытаясь объяснить, что не так, бесполезно.

3. «Итак, я предполагаю, что мой вопрос в том, как мне вернуть правильное значение?» — Я не согласен. В ответе говорится, что приемлемой альтернативой является НЕ возвращать значение. Это стоит знать. Лично я не получаю удовольствия от переписывания домашних заданий. Я не думаю, что полезно выполнять всю работу за того, кто учится.

4. Тогда приемлемым ответом будет «Вам не нужно возвращать значение, поскольку оно уже печатается: [остальная часть вашего ответа здесь]». «Ваш неверный, вот ответ» совсем не помогает.

5. Я никогда не говорил, что ваш ответ был неправильным. Я сказал, что это бесполезно (и, видимо, я не единственный, кто так думает). Добавьте объяснение, и я изменю свой голос. Представьте себе вопрос «Я пытался вычислить 2 2 и получил 5, что я сделал не так?», и вы отвечаете «Вы ошибаетесь, ответ 4». Ваш ответ правильный? Очевидно. Полезно ли это? Совсем нет.