Puh, was stimmt hier nicht? Zinseszinsrechnung, C#?
Hallo, warum liefert der folgende Code ein falsches Ergebnis (ca das Doppelte von dem was er eigentlich raus bekommen sollte) ? Er soll den Zinssatz bei der Rechnung mit Zinseszinsen ermitteln, er bekommt in der Funktion in die er agiert das Startkapital und das Endkapital sowie die Laufzeit in Jahren geliefert und soll daraus den Zinssatz ermitteln:
zinssatz = Math.Round(((100*(Math.Sqrt(Math.Sqrt(endkapital/startkapital))))-100), 2);
2 Antworten
Ein Hinweis, um selbst die Fehler zu finden, die man so einprogrammiert hat. Bei C# ist das nebenbei auch noch als guter Programmierstil angesagt:
Verkette keine Funktionen, weder in der Form f().g() noch in der Form f(g()).
Wenn Du dann noch komplizierte Formelbildungen vermeidest, dann wird aus Deiner Formel:
var GesamtVerhaeltnis = endkapital/startkapital;
var JahresVerhaeltnis = Math.Sqrt(GesamtVerhaeltnis);
var Wassolldasjetztsein = Math.Sqrt(JahresVerhaeltnis);
var Zinssatz= 100 * Wassolldasjetztsein - 100;
var gerundeterZinssatz = Math.Round(Zinssatz, 2);
Wenn Du das im Debugger durch-"stepst", siehst Du sofort, wo etwas schief läuft.
Und - keine Sorge - der Compiler optimiert so, dass das Programm keinen Deut langsamer läuft, als das einzeilige Klammer-Monster.
Die zwei Jahre hast Du in der Form "Sqrt" verewigt. Mit dem doppelten Wuzelziehen gehst Du auf vier Jahre.
Die Formel darunter ist
Kap(n Jahre) = Kap(0) * Zinsfaktor ^(n Jahre)
oder anders geschrieben:
Zinsfaktor = (Kap(n) / Kap(0)) ^ (1/n)
Für 10 Jahre musst Du also die zehnte Wurzel ziehen.
Also einen while Loop bauen der alle 2 Jahre eine Wurzel zieht bis das ende der Laufzeit erreicht ist, aber was ist mit ungeraden Jahren ?
Aber die While Loop Lösung klingt mir zu sehr nach einer Beamten-Lösung (Eine menge Aufwand für ein simples Problem)´. das muss doch einfacher gehen.
Das führt ohnehin zum falschen Ergebnis, mit (Quadrat-)Wurzelziehen erreichst Du nur Laufzeiten von 2, 4, 8, 16 usw. Jahren.
Es gibt die Funktion Math.Pow mit der man entsprechende Wurzeln ziehen kann:
n-te Worzel aus x ist Math.Pow(x, 1.0/n);
Ich stehe auf dem Schlauch, irgendwo muss die Laufzeit in die Rechnung mit einfließen nur wo und wie..
Du hast für die Laufzeit 2 Jahre gewählt, außerdem ziehst du zu oft die Wurzel.
die 2 gehört zur Math.Round funktion und weißt sie an das vorstehende Ergebnis auf 2 Nachkommastellen aufzurunden.
Ansich liefert sie das richtige Ergebnis wenn man diese Werte nimmt:
Startkapital 800€, Endkapital 980€, Laufzeit 4 Jahre.
Aber bei den Werten:
Startkapital 100€, Endkapital 200€, Laufzeit 10 Jahre.
Stimmt das Ergebnis nicht mehr.