iOS 等額本息的方式锤岸,計算月利率阶界、日利率摔敛、年利率
/**
* calculateRate:類excel中的RATE函數(shù)旺入,計算結(jié)果值為月利率场躯,年華利率 需*12期.
* @param nper
* 為總投資期,即該項投資的付款期總數(shù)湾揽。
* @param pmt
* 為各期付款額瓤逼,其數(shù)值在整個投資期內(nèi)保持不變。通常 pmt 包括本金和利息库物,但不包括其他費(fèi)用或稅金霸旗。如果忽略了
* pmt,則必須包含 fv 參數(shù)戚揭。
* @param pv
* 為現(xiàn)值诱告,即從該項投資開始計算時已經(jīng)入帳的款項,或一系列未來付款當(dāng)前值的累積和民晒,也稱為本金精居。
* @param fv
* 為未來值,或在最后一次付款后希望得到的現(xiàn)金余額潜必,如果省略 fv靴姿,則假設(shè)其值為零,也就是一筆貸款的未來值為零磁滚。
* @param type
* 數(shù)字 0 或 1佛吓,用以指定各期的付款時間是在期初還是期末宵晚。 0或省略-期末|| 1-期初
* @param guess
* 預(yù)期利率。 如果省略預(yù)期利率维雇,則假設(shè)該值為 10%淤刃。
* @return
* @since JDK 1.6
*/
- (double) calculateRate:(double)nper pmt:(double) pmt pv:(double) pv fv:(double) fv type:(double) type guess:(double) guess
{
//FROM MS http://office.microsoft.com/en-us/excel-help/rate-HP005209232.aspx
int FINANCIAL_MAX_ITERATIONS = 20;//Bet accuracy with 128
double FINANCIAL_PRECISION = 0.0000001;//1.0e-8
double y, y0, y1, x0, x1 = 0, f = 0, i = 0;
double rate = guess;
if (fabs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
} else {
f = exp (nper * log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = pv + pmt * nper + fv;
y1 = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
i = x0 = 0.0;
x1 = rate;
while ((fabs(y0 - y1) > FINANCIAL_PRECISION) && (i < FINANCIAL_MAX_ITERATIONS)) {
rate = (y1 * x0 - y0 * x1) / (y1 - y0);
x0 = x1;
x1 = rate;
if (fabs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
} else {
f = exp(nper * log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = y1;
y1 = y;
++i;
}
return rate;
}
/**
* @param nper
* 為總投資期,即該項投資的付款期總數(shù)吱型。
* @param pmt
* 為各期付款額逸贾,其數(shù)值在整個投資期內(nèi)保持不變。通常 pmt 包括本金和利息津滞,但不包括其他費(fèi)用或稅金耕陷。如果忽略了
* pmt,則必須包含 fv 參數(shù)据沈。
* @param pv
* 為現(xiàn)值,即從該項投資開始計算時已經(jīng)入帳的款項饺蔑,或一系列未來付款當(dāng)前值的累積和锌介,也稱為本金。
* @return
* @since JDK 1.6
*/
- (double)simpleCalculateRate:(double)nper pmt:(double) pmt pv:(double) pv
{
double fv = 0;
//0或省略-期末支付
double type = 0;
//如果省略預(yù)期利率猾警,則假設(shè)該值為 10%孔祸。
double guess = 0.1;
// 得到的是月利率,*12得到年利率
double rate = [self calculateRate:nper pmt:pmt pv:pv fv:fv type:type guess:guess];
return rate*12*100;
}