не в состоянии пересчитать значение на основе уменьшенного текущего значения - PullRequest
0 голосов
/ 02 ноября 2010

Я пытаюсь создать калькулятор минимального платежа, и у меня проблема с минимальным платежом, который я не могу рассчитать на основе текущего ежемесячного значения То, что я думаю, должно работать ... блокирует браузер. Я закомментировал строку, которая вызывает у меня проблему в коде ниже. Буду признателен, если кто-нибудь сможет протянуть руку.

<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="1296" minHeight="768"
width="100%" height="408"  
backgroundColor="#B9ADFF" >

<fx:Declarations>
    <mx:CurrencyFormatter 
    id="Price" precision="2"
    rounding="nearest"
    decimalSeparatorTo="."
    thousandsSeparatorTo=","
    useThousandsSeparator="false"
    useNegativeSign="true"
    currencySymbol="$"
    alignSymbol="left"/>
</fx:Declarations>

<fx:Script>
<![CDATA[

    import mx.collections.ArrayCollection;

    [Bindable]
    private var myDataProvider:ArrayCollection = new ArrayCollection();

    protected function clickHandler(event:MouseEvent):void { 
        myDataProvider.removeAll();

        //Creditor Constants
        var c:Number = Number(1); //start counting at
        var b1:Number = Number(bal1.text); //initial balance
        var r1:Number = Number(apr.text) / 100 / 12;//convert apr to decimal
        var m1:Number = Number(mpp.text) / 100; //convert mpp to decimal

        var mpp:Number = Number(b1 * m1); //minimum payment by percentage
        var ipd:Number = Number(b1 * r1); //interest paid
        var ppd:Number = Number(mpp - ipd); //principle paid

        while(b1 >= 0) {
            myDataProvider.addItem({
                "months" : c, 
                "intBal" : Price.format(b1),  //balance
                "pPaid" : Price.format(ppd),  //principle paid
                "intPd" : Price.format(ipd),  //interest paid
                "minmopmt" : Price.format(mpp) //minimum payment
            });

            c   = (c + 1); //count rows
            b1 -= (ppd);  // Balance minus Principle Paid

            ///////// THE PROBLEM LINE IS BELOW /////////////
                //mpp = (b1 * m1); //minimum payment by percentage

            ipd = (b1 * r1); //Interest Paid
            ppd = (mpp - ipd); // Principle Paid
        }  
    }
]]>
</fx:Script>

<s:Button label="Calculate" x="26" y="238"
          click="clickHandler(event)" />

<s:TextInput x="22" y="277" id="bal1" restrict="[0-9.\-]" textAlign="right" text="1500"/>   
<s:Label x="158" y="287" text="Initial Balance&#xd;"/>      
<s:TextInput x="22" y="307" id="apr" restrict="[0-9.\-]" textAlign="right" text="15"/>
<s:Label x="158" y="317" text="Annual Percentage Rate (APR)"/>      
<s:TextInput x="22" y="337" id="mpp" restrict="[0-9.\-]" textAlign="right" text="2"/>
<s:Label x="158" y="347" text="Minimum Payment Percentage"/>

<mx:DataGrid dataProvider="{myDataProvider}" y="10" id="dg" height="184" x="22">
    <mx:columns>
        <mx:DataGridColumn dataField="months" headerText="Mo" width="30"/>
        <mx:DataGridColumn dataField="intBal" headerText="Balance" width="120"/>
        <mx:DataGridColumn dataField="pPaid" headerText="Principle Paid"  width="120"/>
        <mx:DataGridColumn dataField="intPd" headerText="Interest Paid"  width="120"/>
        <mx:DataGridColumn dataField="minmopmt" headerText="Min Monthly Pmt"  width="120"/>             
    </mx:columns>
</mx:DataGrid>

</s:Application>

Ответы [ 3 ]

1 голос
/ 02 ноября 2010

Я предполагаю, что вы попадаете в бесконечный цикл.Это может произойти, если приведенные выше расчеты либо сделают ppd отрицательным (так как вы вычитаете его), либо сделаете его таким маленьким, что вы практически никогда не достигнете b1 до нуля (т.е. у вас есть асимптотический график для баланса).

Одним из способов устранения этой проблемы является подсчет строк и выход из цикла, если число строк становится большим.Замените «while (b1> = 0)» на «while (b1> = 0 && c <50)» или что-то в этом роде. </p>

0 голосов
/ 03 ноября 2010

Вы обнаружили парадокс Зенона. Если ставка (оплата) всегда пропорциональна балансу, баланс никогда не станет полностью равным нулю. Предположим, вы всегда платили половину того, что должны:

$ 100

$ 50

$ 25

$ 12,50

...

$ 0,00009536 <- может показаться, что вы уже заплатили, но для вашего цикла while это все равно удовлетворяет <code>b1 > 0.

У вас есть два варианта: 1. Вы можете изменить правила, чтобы минимальный платеж составлял 2% или 20 долларов США, в зависимости от того, что больше. Я думаю, это то, что на самом деле делают кредитные карты, кстати

  1. Вы можете остановиться, когда ваш баланс станет меньше 1 цента.
0 голосов
/ 02 ноября 2010

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

var minimumPaymentAmount = 1;

....

if(b1 * m1 < minimumPaymentAmount) 
  mpp =  minimumPaymentAmount;     
else
  mpp =  b1 * m1; 

Вы должны также рассмотреть ограничение числа строк, рассчитанное как 500 или около того

...