Пока цикл в калькуляторе ежемесячной амортизации выполняется после 0 [Java]

#java #while-loop #java.util.scanner #public #amortization

#java #цикл while #java.util.scanner #общедоступный #амортизация

Вопрос:

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

 import java.util.Scanner;

public class Amortization {

   public static void main(String []args){

       Scanner input = new Scanner(System.in);
       int month = 1;
       int year = 0;

       double balance;
       double rate;
       double payment;
       double principal;
       double calculated_interest;
       double actual_payment;
       double principal_amt;

       System.out.println("What is your principal amount?"); principal = input.nextDouble(); balance = principal;
       System.out.println("What is your monthly interest rate in decimal?"); rate = input.nextDouble();
       System.out.println("What is your monthly payment?"); payment = input.nextDouble();


       while(balance>0){

          if(month == 13){
             year  ;
             month = 1;
          }

          calculated_interest = ((int)(Math.round(balance*rate*100)))/100.0;
          principal_amt = ((int)(Math.round((payment-calculated_interest))*100))/100.0;
          actual_payment = ((int)(Math.round((payment-calculated_interest)*100)))/100.0;

          System.out.println("Year "   year   ", "   "Month "   month   ":");
          System.out.println("Your interest amount is "   "$"   calculated_interest);
          System.out.println("Your principal amount "   "$"   principal_amt);
          balance = ((int)(Math.round((balance-actual_payment)*100)))/100.0;

          System.out.println("Your new balance is "   "$"   balance);
          System.out.println();

          month  ;
      }
      input.close();
     }
  }
  

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

1. Он работает так, как ожидалось ideone.com/d7ONH4 , С каким вкладом вы пытаетесь?

2. Какова ваша основная сумма? 700000 Какова ваша ежемесячная процентная ставка в десятичной системе счисления? .005 Каков ваш ежемесячный платеж? 4196.85

3. И каков ожидаемый результат?

4. это то, что появляется при последних двух запусках: «Год 29, месяц 12: сумма ваших процентов составляет 20,9 долларов США, ваша основная сумма — 4176,0 долларов США, ваш новый баланс составляет 3,45 доллара США. Год 30, месяц 1: сумма ваших процентов составляет 0,02 доллара США, ваша основная сумма — 4197,0 долларов США, ваш новый баланс составляет -4193,38 долларов «, НоЯ не хочу, чтобы он показывал мне «Год 30, месяц 1: сумма ваших процентов составляет 0,02 доллара США, Ваша основная сумма — 4197,0 долларов США, ваш новый баланс составляет -4193,38 доллара США»

Ответ №1:

Проблема в том, что когда цикл находится в 29 году, месяц 12, значения

 Year 29, Month 12:
Your interest amount is $20.9
Your principal amount $4176.0
Your new balance is $3.45
  

Теперь при этом значение balance не меньше 0 , поэтому while будет истинным, и когда вычисляются новые значения, баланс ( balance = ((int)(Math.round((balance-actual_payment)*100)))/100.0; ) становится отрицательным как balance - atual_payment will return negative because the previous balance is $3.45 .

Одним из решений является добавление другого условия if в цикл while после вычисления баланса.

 while(balance>0){

      calculated_interest = ((int)(Math.round(balance*rate*100)))/100.0;
      principal_amt = ((int)(Math.round((payment-calculated_interest))*100))/100.0;
      actual_payment = ((int)(Math.round((payment-calculated_interest)*100)))/100.0;
      balance = ((int)(Math.round((balance-actual_payment)*100)))/100.0;

      if (balance < 0){
        break; //this will break out of the loop
      }

      if(month == 13){
         year  ;
         month = 1;
      }
      System.out.println("Year "   year   ", "   "Month "   month   ":");
      System.out.println("Your interest amount is "   "$"   calculated_interest);
      System.out.println("Your principal amount "   "$"   principal_amt);

      System.out.println("Your new balance is "   "$"   balance);
      System.out.println();

      month  ;
  }
  

Этот код не будет выводить отрицательный баланс.

Ответ №2:

С вашим кодом мало проблем.

  • Сумма процентов и основного платежа каждого месяца не равна ежемесячному платежу.
  • рассчитанный вами «actual_payment» не требуется.
  • Вам не нужно округлять ваши платежи до целых чисел.
  • Поскольку вы принимаете ежемесячные платежи от пользователя, пользователю придется платить меньше, чем ежемесячный платеж за последний месяц, и именно это вызывает -ve Если вы хотите, чтобы ваши платежи были равными каждый месяц, вам придется самостоятельно рассчитывать ежемесячные платежи.

     public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int month = 1;
        int year = 0;
    
        double balance;
        double rate;
        double payment;
        double principal;
        double calculated_interest;
        double actual_payment;
        double principal_amt;
    
        System.out.println("What is your principal amount?");
        principal = input.nextDouble();
        balance = principal;
        System.out.println("What is your monthly interest rate in decimal?");
        rate = input.nextDouble();
        System.out.println("What is your monthly payment?");
        payment = input.nextDouble();
    
        while (balance > 0) {
    
            if (month == 13) {
                year  ;
                month = 1;
            }
            calculated_interest = (balance * rate * 100) / 100.0;
            principal_amt = payment - calculated_interest;
    
            System.out.println("Year "   year   ", "   "Month "   month   ":");
            System.out.println("Your interest amount is "   "$"   calculated_interest);
    
            if (balance > payment) {
    
                balance = ((int) (Math.round((balance - principal_amt) * 100))) / 100.0;
                System.out.println("Your principal amount "   "$"   principal_amt);
                System.out.println("Your new balance is "   "$"   balance);
            } else {
                System.out.println("Your principal amount "   "$"   (balance - calculated_interest));
                System.out.println("Your new balance is "   "$"   0);
                System.out.println("You'll only pay $"   (calculated_interest   balance)   " this month.");
                break;
            }
    
            System.out.println();
    
            month  ;
        }
        input.close();
    }