Avatar billede kennethj Nybegynder
19. februar 2004 - 11:57 Der er 6 kommentarer

Kompliceret beregning af et lånsom stopper før restgælden er 0

Hej i kloge hoveder.

Er der nogle som ved hvordan man kan lave en beregning af et lån på f.eks. 100.000 som skal løbe over f.eks. 3 år (36 mdr) og derefter ophøre når der er f.eks. 20% tilbage af lånebeløbet. Altså 20.000 i overstående tilfælde.

Er der nogle ideer???
Avatar billede satanic_raven Nybegynder
19. februar 2004 - 13:51 #1
Altså som en slags afbetaling af et lån eller misforstår jeg dig???

S.R.
Avatar billede kennethj Nybegynder
19. februar 2004 - 14:46 #2
Ja, det er rigtigt forstået. Normalt når man laver en låneberegning, hvor man regner den månedlige ydelse ud, går man ud fra, at lånet skal slutte på kr. 0! Det specielle ved min beregning er, at lånet skal stoppet ved en given procentdel af hovedstolen. Altså f.eks. 20% af 100.000, hvilket jo er 20.000 ...

Et eksempel kunne være (i cirka-tal)

Hovedstol 100.000
Månedlig ydelse vil cirka være 2.500 (indtil der mangler 20.000)
Sidste ydelse 20% af de 100.000 = 20.000

Der skal altså beregnes en månedlig ydelse frem til der mangler 20.000 at afdrage. Herefter er sidste ydelse kr. 20.000

Renterne skal selvfølgelig beregnes ned til der mangler de famøse 20%, altså til der mangler 20.000

Min kode indtil videre:

<html>

<HEAD>

<SCRIPT LANGUAGE="JavaScript">
function Loan() {
var housePrice;
var IR;
var dpayment;
var years;
var monthPay;
var month;
switch(document.calcform.startm.value) {
case "januar":
document.calcform.startm.value="0";
parseInt(document.calcform.startm.value)
break;
case "februar":
document.calcform.startm.value="1";
parseInt(document.calcform.startm.value)
break;
case "marts":
document.calcform.startm.value="2";
parseInt(document.calcform.startm.value);
break;
case "april":
document.calcform.startm.value="3";
parseInt(document.calcform.startm.value);
break;
case "maj":
document.calcform.startm.value="4";
parseInt(document.calcform.startm.value);
break;
case "juni":
document.calcform.startm.value="5";
parseInt(document.calcform.startm.value);
break;
case "juli":
document.calcform.startm.value="6";
parseInt(document.calcform.startm.value);
break;
case "august":
document.calcform.startm.value="7";
parseInt(document.calcform.startm.value);
break;
case "september":
document.calcform.startm.value="8";
parseInt(document.calcform.startm.value);
break;
case "oktober":
document.calcform.startm.value="9";
parseInt(document.calcform.startm.value);
break;
case "november":
document.calcform.startm.value="10";
parseInt(document.calcform.startm.value);
break;
case "december":
document.calcform.startm.value="11";
parseInt(document.calcform.startm.value);
break;
default:
document.calcform.startm.value="0";
parseInt(document.calcform.startm.value);
break;
}
housePrice = parseFloat(document.calcform.price.value);
dpayment = parseFloat(document.calcform.dpayment.value);
IR = parseFloat(document.calcform.interest.value);
years = parseFloat(document.calcform.time.value);
housePrice = housePrice - dpayment;
month = years * 12;
interestRate = IR / 12;
negmonth =- 1 * month;
var bottom = 1 - (Math.pow(interestRate+1,negmonth));
var top = interestRate;
var mid = top / bottom;
var dec;
document.calcform.monthPay.value = (housePrice * mid);
monthPay = document.calcform.monthPay.value;
document.calcform.monthPay.value = eval(monthPay);
housePrice = housePrice - document.calcform.monthPay.value;
document.calcform.month.value = month;
}
function convert() {
var startmonth = new String();
startmonth = document.calcform.startm.value;
document.calcform.startm.value = startmonth.toLowerCase();
}
function changenum() {
document.calcform.startyear.value=parseInt(document.calcform.startyear.value);
}
var d = new Date;
function getFieldValue (strFieldName) {
var strFieldValue;
var objRegExp = new RegExp(strFieldName + "=([^&]+)","gi");
if (objRegExp.test(location.search))
strFieldValue = unescape(RegExp.$1);
else strFieldValue="";
return strFieldValue;
}
function Currency(money1) {
var money = new String(money1);
var decimal = money.indexOf(".",[0]);
var money = money.substring(0,decimal+3);
var money1 = parseFloat(money);
return money;
}
var startmonth;
startmonth = getFieldValue("startm");
var monthofpayment = new String;
month = getFieldValue("month");
monthPay = getFieldValue("monthPay");
Houseprice = getFieldValue("price");
Ir = getFieldValue("interest");
Ir = Ir/12;
year = getFieldValue("startyear")
function check() {
var dPayment = document.calcform.dpayment.value;
var price = document.calcform.price.value;
if(price.indexOf(",") >= 0) {
alert("Please do not put commas in the Price number")
  }
}
function check1() {
var dPayment = document.calcform.dpayment.value;
if(dPayment.indexOf(",") >= 0) {
alert("Please do not put commas in the Down Payment number");
  }
}
//  End -->
</script>

</HEAD>
<BODY>

<form method="get" name=calcform action="amortization.htm">
<table border=0>
<tr>
<td valign="top">
Købspris
<br>
</td>
<td valign="top">
kr
<input name=price onblur="check()" size=10>
</td>
</tr>
<tr>
<td>
Udbetaling
</td>
<td>
kr
<input name=dpayment onblur="check1()" size=10>
<br>
</td>
</tr>
<tr>
<td>
Rentesats
<br>
</td>
<td>
<select size="1" name="interest">
  <option selected value="0.04">4%</option>
  <option value="0.05">5%</option>
  <option value="0.06">6%</option>
</select>
<br>
</td>
<tr>
<td>
Låneperiode
<br>
</td>
<td>
<select size="1" name="time">
  <option value="1">1 år</option>
  <option value="2">2 år</option>
  <option value="3">3 år</option>
  <option selected value="4">4 år</option>
</select>
<br>
</tr>
<tr>
<td>
Startdato (Måned / År)
</td>
<td>
<input name=startm onblur="convert()" size=10>
<input name=startyear onblur="changenum()" size=10>
</td>
</tr>
<input name=month type=hidden>
<input name=monthPay type=hidden>
<tr>
<td>
<input type=submit value="Beregn ydelse" onmouseover="check()" onclick="Loan()">
</td>
</tr>
</table>
</form>
<table border=0>
<tr>
<td>
Købspris
</td>
<td>
kr
<script language="javascript">
<!--
document.write(getFieldValue("price"));
//-->
</script>
</td>
</tr>
<tr>
<td>
Udbetaling
</td>
<td>
kr
<script language="javascript">
<!--
document.write((getFieldValue("dpayment")));
//-->
</script>
</td>
</tr>
<tr>
<td>
Månedlig ydelse
</td>
<td>
kr
<script language="javascript">
<!--
var payment = getFieldValue("monthPay");
payment=Currency(payment);
document.write(payment);
//-->
</script>
</td>
</tr>
<tr>
<td>
# år
</td>
<td>
<script language="javascript">
<!--
document.write(month/12);
-->
</script>
</td>
</tr>
</table>
<table border="1" align="left">
<tr>
<th width="125">
Måned/År
</th>
<th width="125">
Rente
</th>
<th width="125">
Afdrag
</th>
</tr>
<script language="JavaScript">
<!--
var halfmonth;
halfmonth = month / 2;
for(y = 0; y <= month; y++) {
var interest = Houseprice * Ir;
var principal = monthPay - interest;
Houseprice = Houseprice - principal;
interest = Currency(interest);
principal = Currency(principal);
if(startmonth > 11) {
startmonth = 0;
year++;
}
switch(startmonth.toString()) {
case "0":monthofpayment="Januar";
break;
case "1":monthofpayment="Februar";
break;
case "2":monthofpayment="Marts";
break;
case "3":monthofpayment="April";
break;
case "4":monthofpayment="Maj";
break;
case "5":monthofpayment="Juni";
break;
case "6":monthofpayment="Juli";
break;
case "7":monthofpayment="August";
break;
case "8":monthofpayment="September";
break;
case "9":monthofpayment="Oktober";
break;
case "10":monthofpayment="November";
break;
case "11":monthofpayment="December";
}
document.write("<tr><td width='125'>")
document.write(monthofpayment+" "+year+"</td>"+"<td width='125'>"+"kr "+interest+"</td><td width='125'>"+"kr "+principal);
document.write("</td></tr>");
startmonth++;
}
//-->
</script>
</table>


</body>

</html>
Avatar billede roenving Novice
19. februar 2004 - 17:10 #3
I princippet tror jeg, at det faktisk er umuligt at beregne, men man kan jo approksimere sig frem til det, ved at vedblive at kalde en simpel annuitets-funktion, her en pseudo-kode:

funktion beregnAfdragPrMd(hovedstol,rentePrMd,md){
  return annuitetsberegning;
}

rente = 1;
md = 36;
start = 100000;
slut = 20000;
approxAfdrag = 2500;
afdrag = beregnAfdragPrMd(start,rente,slut-approxAfdrag);

while(Math.abs(afdrag - approxAfdrag) > 0.01){
  approxAfdrag = afdrag;
  afdrag = beregnAfdragPrMd(start,rente,slut-approxAfdrag);
}
Avatar billede roenving Novice
19. februar 2004 - 17:13 #4
Hov, der fik jeg blandet lidt rigeligt !-)

...
approxAfdrag = 2500;
afdrag = beregnAfdragPrMd(start-(slut-approxAfdrag),rente,md);

while(Math.abs(afdrag - approxAfdrag) > 0.01){
  approxAfdrag = afdrag;
  afdrag = beregnAfdragPrMd(start-(slut-approxAfdrag),rente,md);
}
Avatar billede kennethj Nybegynder
20. februar 2004 - 10:50 #5
Er ret sikker på det kan beregnes korrekt. Det kan man ihvertfald på en lommeregner. Der ligger man simpelthen et sidste afdrag ind på f.eks. 20.000 og så finder lommeregneren ellers ud af ydelsen indtil da. Så samme formel må jo kunne få pc'en til at bruge. Prøver lige at kigge lidt på din pseudokode, roenving!

Er der andre gode forslag?
Avatar billede roenving Novice
23. februar 2004 - 00:28 #6
-- og jeg fandt også ud af, at man som standard betaler renter pr. måned, så det egentlig er en simpel annuitetsberegning:

Man skal bare beregne afdrag på den del af gælden, som er differencen mellem start og slut (og så selvfølgelig tillægge hver måneds ydelse renter af slut-beløbet !-)

Altså bliver ydelse pr. måned:

ydelse på afdragsgæld (hovedstol-rest) + rente på rest ...

-- og Excel klarer det direkte, så det er bare annuitetsformlen, der skal findes frem !-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester