#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(); }