无法根据减少的当前值重新计算值

时间:2010-11-02 13:30:38

标签: flex actionscript-3 flexbuilder

我正在尝试建立一个最低付款计算器,并且我遇到的问题是最低付款无法根据当前月度值进行计算。我认为应该工作......锁定浏览器。我已经注释掉了下面代码中给我一个问题的那一行。如果有人能伸出援助之手,我将不胜感激。

<?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 个答案:

答案 0 :(得分:1)

我的猜测是你发现自己陷入无休止的循环中。如果上面的计算使ppd为负(因为你减去它),或者使它变得如此之快以至于你基本上没有将b1变为零(即,你有一个平衡的渐近图),就会发生这种情况。 p>

解决这个问题的一种方法是,如果行数变大,则计算行数并突破循环。将“while(b1&gt; = 0)”更改为“while(b1&gt; = 0&amp;&amp; c&lt; 50)”或其他内容。

答案 1 :(得分:0)

付款必须达到最低限额。在你的情况下没有,它正好在你指出的那一行。考虑定义最低付款金额。 e.g。

var minimumPaymentAmount = 1;

....

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

您还应该考虑将计算的行数限制为大约500左右

答案 2 :(得分:0)

你发现了芝诺的悖论。如果费率(付款)始终与余额成比例,则余额将永远不会完全归零。假设您总是支付欠款的一半:

$ 100

$ 50

$ 25

$ 12.50

...

$ 0.00009536&lt; - 看起来你已经完成了支付,但对于你的while循环,那仍然满足b1 > 0

您有两种选择: 1.您可以更改规则,以便最低付款额为2%或20美元,以较高者为准。我认为这就是信用卡实际上做的事,顺便说一句

  1. 当您的余额低于1美分时,您可以停止。