为什么我的摊销程序似乎无缘无故地提前停止?

时间:2019-03-28 23:59:51

标签: java loops amortization

[请阅读]编辑:问题已经缩小到我计算出的付款金额不正确的事实。我现在需要一种方法来计算还清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 ish

因此,付款金额(根据此计算)应为142。但是,这完全不正确,如您在注释线程中看到的那样。经过反复试验,正确的付款次数实际上是221,到目前为止,我还无法使用任何计算得出该值。因此,以下内容:

tl; dr-我需要一种方法来仅使用初始贷款金额,利率和每月建议的支付金额来准确计算摊销中的支付数量。

预先感谢您,此定义缩小了问题的范围。


[原始帖子]我创建了一个程序,可以为我的AP Compsci类进行摊销图表。一切运行顺利,直到我告诉程序处理更大的数字。由于某种原因,该程序只是停止在某个值,我不知道为什么。我希望这里的人可以帮助我调试它。

我在我的IDE中使用了intelliJ,但我不知道还有什么其他信息对您有帮助。

首先:是的,我知道我应该使用ArrayList而不是一维数组,我在上课了解它们之前就开始了此操作,而且我不想重做。我只想知道现有代码的问题,所以我可以上交并完成它。唯一的要求是它必须正常运行。是的,我知道代码完全糟透了,我不想听到它。只是用我现有的代码查找问题。是的,我知道我很喜欢编码。请不要烤;-;

尝试注释掉循环,逐字逐句地手工计算,逐步进行,等等。似乎无法得出任何结论。

这是方法:

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 :(得分:-2)

递增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);