我正在尝试建立一个最低付款计算器,并且我遇到的问题是最低付款无法根据当前月度值进行计算。我认为应该工作......锁定浏览器。我已经注释掉了下面代码中给我一个问题的那一行。如果有人能伸出援助之手,我将不胜感激。
<?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
"/>
<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>
答案 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美元,以较高者为准。我认为这就是信用卡实际上做的事,顺便说一句