[Anfänger] Zinseszins --> Verständnisfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jonsered
User
Beiträge: 3
Registriert: Dienstag 3. März 2020, 16:02

Hallo Community.

Bin ganz neu im Bereich der Programmierung und macht mir Spaß, auch wenn ich manchmal an kleinen Dingen noch recht ange sitze. Aber dafür lernt an ja

Ich habe ein kleines Lernprojekt für mich erstellt und es funktioniert auch, jedoch haben sich hier zwei Fragen aufgetan...

Code: Alles auswählen

print("Mein erster, einfacher Zinseszinsrechner")
print()
print("Wieviel Geld möchtest du investieren?")
einzahlen = float(input())
print()
print("Wie hoch sind die Zinsen?")
zinsen = float(input())
# jaehrlich = einzahlen / 100 * zinsen + einzahlen | wollte es zum Testen direkt in print ausrechnen lassen
print()
print("Bei einer jährlichen Verzinsung beträgt das Endergebnis: €" ,einzahlen / 100 * zinsen + einzahlen)
print("damit wurden in einem Jahr €",einzahlen/100*zinsen, "Zinsen generiert")
print()
monatlich = float((einzahlen * zinsen) / ( 100*12 ))
print(monatlich) #funktioniert
monatjahr = float(einzahlen * ((zinsen / 12 / 100) +1)**(1*12))
# Kn = K0 * ((p/m / 100) + 1)^n*m ( https://www.zinsen-berechnen.de/zinsformeln/unterjaehriger-zinseszins.php )
print("Bei einer monatlichen Verzinsung beträgt das Endergebnis nach einem Jahr: €", monatjahr)
print("damit wurden in einem Jahr €",monatjahr - einzahlen, "Zinsen generiert")
#print("Bei einer monatlichen Verzinsung beträgt das Endergebnis nach einem Jahr: €", (einzahlen * ((zinsen / 12 / 100) +1)**(1*12)) --> funktioniert nicht (?) 
#Unterschied zu https://www.finanzfluss.de/zinseszinsrechner/ recht groß...
Die Kommentare im Code, wo ich noch nicht ganz schlau werde...

Zeile 19: Ich verstehe nicht, warum ich das ganze nicht direkt ausrechnen lassen kann in der Ausgabe. Bei der jährlichen hat es doch auch geklappt?
Sollte man generell nicht in der Ausgabe rechnen? Stichwort Sauberkeit des Codes & Lesbarkeit?

Wenn ich mein Ergebnis mit dem Rechner von Finanzfluss vergleiche, ist der Unterschied doch größer als erwartet... Wie seht ihr das? Habe ich einen (groben) Fehler gemacht?

PS: Nicht wundern über dieses "Projekt" und die Kommentare, dient rein für Lernzwecke für mich.
RLeoP
User
Beiträge: 5
Registriert: Dienstag 3. März 2020, 16:38

Probier mal

Code: Alles auswählen

print("Bei einer monatlichen Verzinsung beträgt das Endergebnis nach einem Jahr: €", (einzahlen * ((zinsen / 12 / 100) +1)**(1*12)))
dann müsste es funktionieren. Du hast nur eine Klammer vergessen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

In der "Ausgabe" zu rechnen ist bei so kleinen Programmen noch ok. Schöner aber ist es, für Berechnungen Funktionen zu nutzen. Bei größeren Programmen ist das sogar unabdingbar, z.B.:

Code: Alles auswählen

def calculate(k, p, n):
    return k * (1 + p) ** n

Der Zinssatz p muss dabei der Zinsperiode n entsprechen, sonst erhältst Du falsche Ergebnisse.
Jonsered
User
Beiträge: 3
Registriert: Dienstag 3. März 2020, 16:02

RLeoP hat geschrieben: Dienstag 3. März 2020, 18:13 Probier mal

Code: Alles auswählen

print("Bei einer monatlichen Verzinsung beträgt das Endergebnis nach einem Jahr: €", (einzahlen * ((zinsen / 12 / 100) +1)**(1*12)))
dann müsste es funktionieren. Du hast nur eine Klammer vergessen.
Oh mann, Danke...
Sehr peinlich, habe echt lange gesucht und hatte auch die Klammern in Verdacht, aber an die print Klammer habe ich nicht gedacht... Eventuell sollte ich nicht mehr in der Python IDLE schreiben - in einem "anständigen" Editor würde sowas sicherlich markiert werden...
kbr hat geschrieben: Mittwoch 4. März 2020, 09:38 In der "Ausgabe" zu rechnen ist bei so kleinen Programmen noch ok. Schöner aber ist es, für Berechnungen Funktionen zu nutzen. Bei größeren Programmen ist das sogar unabdingbar, z.B.:

Code: Alles auswählen

def calculate(k, p, n):
    return k * (1 + p) ** n

Der Zinssatz p muss dabei der Zinsperiode n entsprechen, sonst erhältst Du falsche Ergebnisse.
Danke, kopiere ich mal rein. Bei Funktionen bin ich noch nicht angekommen, aber super, wenn man da dann schon etwas verständliches aus einem "alten" Code hat.

Ich danke euch
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, man sollte nicht generell in der Ausgabe rechnen, sondern nur triviale Rechnungen machen.
float-Zahlen nochmal mit float zu konvertieren ist überflüssig. Zwischenergebnisse machen die Formeln lesbarer. Auch sprechendere Namen:

Code: Alles auswählen

zinsen_pro_monat = zinsen / 100 / 12
zinsen_monatlich = einzahlen * zinsen_pro_monat
gesamtbetrag_jahr = einzahlen * (zinsen_pro_monat + 1)**12
Zur Ausgabe benutzt man format-Strings:

Code: Alles auswählen

print(f"Bei einer monatlichen Verzinsung beträgt das Endergebnis nach einem Jahr: €{gesamtbetrag_jahr:.2f}")
print(f"damit wurden in einem Jahr €{gesamtbetrag_jahr - einzahlen:.2f} Zinsen generiert")
Jonsered
User
Beiträge: 3
Registriert: Dienstag 3. März 2020, 16:02

Ich danke dir.

Generell würde ich eh nicht in der Ausgabe rechnen, dieser Weg diente mir mehr zum Verständnis und ob es überhaupt geht. Persönlich finde ich es, so wie du es machst, auch viel besser, sauberer und vor allem strukturierter.
Das mit den float Zahlen schaue ich mir nochmal an und werde da an vielen Stellen nochmals rumprobieren. Danke für den Hinweis! Auch für die Printausgabe, die Kommastellen haben mich bereits genervt ;-) und hatte die Hoffnung, dass diese noch kommen werden :-)
Antworten