2010-11-02 3 views
0

J'essaie de créer une calculatrice de paiement minimum et j'ai un problème avec le paiement minimum ne pouvant pas calculer en fonction de la valeur mensuelle actuelle. Ce que je pense devrait fonctionner ... verrouille le navigateur. J'ai commenté la ligne qui me pose un problème dans le code ci-dessous. J'apprécierais que quelqu'un puisse donner un coup de main.impossible de recalculer une valeur basée sur la valeur actuelle diminuée

<?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> 

Répondre

0

Il doit y avoir un montant de seuil minimum où le paiement doit se terminer. Dans votre situation il n'y en a pas et c'est exactement à la ligne où vous l'avez indiqué. Envisagez de définir un montant de paiement minimum. par exemple.

var minimumPaymentAmount = 1; 

.... 

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

Vous devriez également envisager de limiter le nombre de lignes calculées à 500 ou comme si

1

Je pense que vous vous trouvez dans une boucle sans fin. Cela peut arriver si vos calculs ci-dessus rendent soit ppd négatif (puisque vous le soustrayez), soit le rendent si petit que vous n'obtiendrez jamais b1 (c'est-à-dire que vous avez un graphique asymptotique pour le solde). Une façon de résoudre ce problème serait de compter les lignes et de sortir de la boucle si le nombre de lignes devenait important. Changez "while (b1> = 0)" en "while (b1> = 0 & & c < 50)" ou quelque chose.

0

Vous avez découvert le paradoxe de Zénon. Si le taux (paiement) est toujours proportionnel au solde, le solde ne sera jamais complètement nul. Supposons que vous avez toujours payé la moitié de ce que vous devez:

$ 100

50 $

25 $

12,50 $

...

$ 0,00009536 < - qui peut sembler comme vous » re fait payer, mais à votre boucle tout, c'est encore b1 > 0.

Vous avez deux options: 1. vous pouvez modifier les règles de façon à ce que le paiement minimum soit de 2% ou 20 $, selon le montant le plus élevé. Je pense que c'est ce que les cartes de crédit font réellement, btw

  1. Vous pouvez arrêter lorsque votre solde doit être inférieur à 1 cent.
Questions connexes