Почему моя программа амортизации прекращается рано, по-видимому, без причины? - PullRequest
0 голосов
/ 29 марта 2019

[ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ] РЕДАКТИРОВАТЬ: Проблема была сужена до того, что я исчисляю сумму платежей, необходимую неточно. Теперь мне нужен способ рассчитать количество платежей, необходимых для погашения x суммы займа, с y суммой процентов и z суммой, выплачиваемой только за месяц. Мой первоначальный подход состоял в том, чтобы взять ежемесячный платеж, предоставленный пользователем (например, 250 долларов США) с процентной ставкой (например, 13,5%), чтобы погасить кредит (например, 1000 долларов США) и получить сумму, выплаченную за интересующий месяц (странно, я знаю) Таким образом, вы получите:

250 - 250 * 0,135 = 216,25

Затем разделите общую сумму кредита на это число, так что

1000 / 216,25 = 4,62

Затем установите значение, чтобы получить 5 полных платежей. Это сработало для только что приведенного примера, как вы можете видеть в коде внизу моего поста, но если мы возьмем для примера:

Кредит на 200 000 долларов США, 6% процентная ставка и выплаты в размере 1500 долларов США в месяц, мы получаем:

1500 - 1500 * 0,06 = 1410

А потом:

200 000 долл. США / 1410 = 141,8 долл. США

Таким образом, сумма платежей (в соответствии с этим расчетом) должна составлять 142. Однако это совершенно неверно, как вы можете видеть в ветке комментариев. Методом проб и ошибок правильное количество платежей на самом деле составляет 221, и я до сих пор не смог получить это значение, используя какие-либо расчеты. Отсюда следующее:

tl; dr - мне нужен способ, чтобы точно рассчитать количество платежей в амортизации, используя только начальную сумму кредита, процентную ставку и предлагаемую сумму, выплачиваемую в месяц.

Заранее спасибо, и это определение сужает проблему.


[ОРИГИНАЛЬНАЯ ПОЧТА] Я создал программу, которая делает графики амортизации для моего класса AP Compsci. Все шло гладко, пока я не скажу программе обрабатывать большие числа. По какой-то причине программа просто останавливается на определенном значении, и я не могу понять, почему. Я надеялся, что кто-то здесь может помочь мне отладить это.

Я использую intelliJ для своей IDE, и я не знаю, какая другая информация действительно поможет здесь.

Прежде всего: да, я знаю, что должен использовать ArrayList вместо 1d-массива, я начал это до того, как мы узнали о них в классе, и мне не хочется его переделывать. Я просто хочу знать проблемы с моим существующим кодом, чтобы я мог передать его и покончить с этим. Единственное требование - чтобы он функционировал должным образом. Да, я знаю, что код - полный отстой, я не хочу его слышать, пожалуйста. Просто ищу проблему с моим существующим кодом. Да, я знаю, что отстой в кодировании. Пожалуйста, не жарите; -;

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

Вот метод:

public static void amortization(){

        int[] info = new int[10000000];

        double Lamt;
        double IRate;
        double MRate;
        double payMonth;
        double firstlyMonth;
        double interestedSub;
        double interestedAmt;
        double amtPayments;
        double mPayment;
        double iPayment;
        double pPayment;
        double pBalance;
        double q;
        double finalMPymt;
        double finalIPymt;
        double finalPPymt;
        double finalPBalance;


        Scanner amortkey = new Scanner(System.in);

        System.out.println("Please enter the following values:");
        System.out.println("Loan amount:");
        Lamt=amortkey.nextDouble();
        System.out.println("Annual Interest Rate, in decimal form:");
        IRate=amortkey.nextDouble();
        System.out.println("Monthly Payment Amount:");
        payMonth=amortkey.nextDouble();

        interestedSub=payMonth * IRate;
        interestedAmt=payMonth - interestedSub;
        firstlyMonth=Lamt / interestedAmt;
        amtPayments=Math.ceil(firstlyMonth);

        MRate=IRate / 12;

        for(int a=0; a<amtPayments; a++){
            info[a]=a+1;
        }


        System.out.println();
        System.out.println("     PAYMENT          MONTHLY          INTEREST          PRINCIPAL          PRINCIPAL");
        System.out.println("     NUMBER           PAYMENT          PAYMENT           PAYMENT             BALANCE");
        System.out.println();

        pBalance=Lamt; //1000


        //THIS LOOP DETERMINES THE CHART
        for(int b=0; b<amtPayments-1; b++){//b starts 0, must climb to the payments that must be made.

            iPayment=pBalance * MRate; //calculate interest payment by taking the rate portion of the principal away.
            pPayment=payMonth - iPayment;//calculate principal payment independently from total month pay
            q=pBalance - pPayment;//calculate new balance of principal, q
            mPayment=iPayment + pPayment;//make monthly payment equal to whatever the principal is plus the interest owed
            pBalance=q;//reset the loop with a new principal balance

            System.out.println("       " + info[b] + "               " + Math.round(mPayment * 100.00) / 100.00 + "            " + Math.round(iPayment * 100.00) / 100.00 + "              " + Math.round(pPayment * 100.00) / 100.00 + "               " + Math.round(pBalance * 100.00) / 100.00);
            System.out.println();


            if(pBalance<mPayment){

                finalIPymt=pBalance * MRate;
                finalMPymt=pBalance + finalIPymt;
                finalPPymt=pBalance;
                finalPBalance=0;
                System.out.println("       " + info[b+1] + "               " + Math.round(finalMPymt * 100.00) / 100.00 + "            " + Math.round(finalIPymt * 100.00) / 100.00 + "              " + Math.round(finalPPymt * 100.00) / 100.00 + "               " + Math.round(finalPBalance * 100.00) / 100.00);


            }



        }


    }


Сначала попробуйте числа 1000, 0,135 и 250.

Ожидаемый вывод

     PAYMENT          MONTHLY          INTEREST          PRINCIPAL          PRINCIPAL
     NUMBER           PAYMENT          PAYMENT           PAYMENT             BALANCE

       1               250.0            11.25              238.75               761.25

       2               250.0            8.56              241.44               519.81

       3               250.0            5.85              244.15               275.66

       4               250.0            3.1              246.9               28.76

       5               29.09            0.32              28.76               0.0

И фактический результат действительно одно и то же. Это работает как шарм.

Теперь попробуйте эти числа: 200000, 0,06 и 1500.

По какой-то странной причине программа заканчивается на входе 141 с окончательным выводом:

       141               1500.0            494.88              1005.12               97970.54

Он заканчивается кодом выхода 0, без ошибок, и просто останавливается прямо здесь.

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

Приветствия: D

1 Ответ

0 голосов
/ 29 марта 2019

Увеличьте b, а затем используйте это b вместо b + 1, прежде чем писать эту строку

System.out.println("       " + info[b+1] + "               " + Math.round(finalMPymt * 100.00) / 100.00 + "            " + Math.round(finalIPymt * 100.00) / 100.00 + "              " + Math.round(finalPPymt * 100.00) / 100.00 + "               " + Math.round(finalPBalance * 100.00) / 100.00);
...