Wie zum Henker... (Festbetrag mit jährlicher Steigerung)

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.
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Hoi,

ich möchte gerne Folgendes berechnen:

Ich habe eine Anfangssumme von 100 EUR, die bspw. ab dem 01.01.2021 monatlich gezahlt wird. Nun gibt es einen Erhöhungssatz von 3% järlich (aus 100 EUR werden 103 EUR, aus 103 EUR werden 106,09 EUR, aus 106,09 EUR werden 109,27 EUR usw.). Nun soll es im Prinzip so aussehen, dass ich eine Ausgabe habe, die mir die jährlichen Zahlungen über x Jahre ausgibt. Wie stellt man das am schlausten an? Ich gehe davon aus, dass das machbar ist, aber da ich noch recht neu bin, hab ich gerade null Plan, wie ich das anstellen soll. Vielleicht ist es auch die Uhrzeit, die mich verzweifeln lässt.

Also die Ausgabe soll ungefähr so aussehen:

Eingegangene Zahlungen in 2021: 1236 EUR
Eingegangene Zahlungen in 2022: 1273,08 EUR
usw.

Die Jahreszahl in einer while- oder for-Schleife zu erhöhen kriege ich noch hin, aber die anfänglichen 100 EUR, aus denen nach einem Jahr 103 EUR werden und darauf das Jahr 106,09 EUR.... Da scheitere ich komplett. Lässt sich das doch nicht so einfach in einer Funktion definieren und/oder mit in die Schleife einbinden?

Für Tipps oder sogar eine Lösung wäre ich echt dankbar.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie berechnet man 100 plus 3%? Bzw. allgemein `betrag` plus x%?
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Ich hätte es jetzt einfach so berechnet:

res = 100 * 1.03
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und wenn du statt 100 res schreibst, und das dann n mal in der for-Schleife rechnen läss - was passiert dann?
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Oh man, so manchmal hat man mehr als nur Tomaten auf den Augen. Thx :)
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Jetzt sieht es so aus:

Code: Alles auswählen

jahr = 2020
res = 100 * 1.03

for i in range(1,10):
    res *= 1.03
    jahr += 1
    print(f"{jahr}, eingezahlt: {res*12:.2f} Euro")
Ist es jetzt auch möglich die errechneten Werte aus der for-Schleife zu summieren? Also in Richtung

Code: Alles auswählen

print(sum(res))
oder sowas in der Art?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie man eine Summe bildet, zeigst Du doch schon mit `jahr`, wobei man das besser mit einer for-Schleife macht:

Code: Alles auswählen

betrag = 100 * 1.03

for jahr in range(2021, 2030):
    betrag *= 1.03
    print(f"{jahr}, eingezahlt: {betrag*12:.2f} Euro")
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Okay, so ist es natürlich kürzer und an sich übersichtlicher geschrieben, aber es erschließt sich mir noch nicht ganz, wie ich die Beträge aus der for-Schleife zusammenaddiere, damit ich eine "summe_komplett" aus allen eingezahlten Beträgen erhalte.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist der Unterschied zwischen einer Multiplikation und einer Addition? Also rein von der Programmierung her?
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Naja, die Begriffe sagen es ja schon aus: entweder ich multipliziere bspw. zwei Zahlen oder ich addiere sie. Ich weiß nicht, wie du mir damit jetzt auf die Sprünge helfen möchtest. Sorry, logisches Denken ist manchmal echt hart. :D
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Alternativ zum gezeigten Ansatz kannst du auch die gängige Formel für Zinseszinsen verwenden und den Betrag nach einem bestimmten Zeitraum ohne Summierung direkt berechnen. Da brauchst du dann eben eine Zählschleife (/itertools.count) , um den Exponenten zu inkrementieren.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

So?

Code: Alles auswählen

def zinsen(kapital, zinsen, jahre):
    return kapital * (1 + zinsen) ** jahre - kapital

Kompliziert wird es dann, wenn sich das Kapital ändert (Ein-/Auszahlungen).
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Das Kapital ändert sich ja, es gibt gar keine Zinsen auf das Kapital — oder zumindest steht davon nichts in der Aufgabe — es geht um die monatlichen Einzahlungen die jedes Jahr um einen Prozentsatz angehoben werden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Vielleicht könnte numpy hier weiterhelfen: https://numpy.org/numpy-financial/latest/

Wichtig ist, dass diese Funktionen noch in numpy enthalten sind, zukünftig aber entfernt werden.
Deswegen gibt es das numpy-financial Paket.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

Danke für die vielen Anregungen. Das hat mir wirklich sehr geholfen.

Ich bin dann endlich auf eine für mich akzeptable Lösung gekommen. Wenn das noch schöner geht, gerne her mit den Tips. :)

Code: Alles auswählen

betrag = 100 * 1.03 * 12
summe = 0

for jahr in range(2021, 2030):
    print(f"{jahr}, eingezahlt: {betrag:.2f} Euro")
    betrag *= 1.03
    summe += betrag
    
print(f"Gesamt: {summe:.2f} Euro")
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Ist es Absicht, dass die Gesamtsumme von den angezeigten Einzelbeiträgen abweicht?
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Ich dachte an so etwas (ohne itertools) :

Code: Alles auswählen

In [1]: base = 100 * 12
   ...: rate = 3/100
   ...: start, end = 2021, 2030
   ...: values = [base*(1+rate)**i for i in range(1, end-start+1)]
   ...: for i, value in enumerate(values):
   ...:     print(f"{start+i}, eingezahlt: {value:.2f} Euro")
   ...: print(f"Gesamt: {sum(values):.2f} Euro")
2021, eingezahlt: 1236.00 Euro
2022, eingezahlt: 1273.08 Euro
2023, eingezahlt: 1311.27 Euro
2024, eingezahlt: 1350.61 Euro
2025, eingezahlt: 1391.13 Euro
2026, eingezahlt: 1432.86 Euro
2027, eingezahlt: 1475.85 Euro
2028, eingezahlt: 1520.12 Euro
2029, eingezahlt: 1565.73 Euro
Gesamt: 12556.66 Euro
Der Code ist jedoch sogar eher komplexer.
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

@Sirius3
ist das so?
Krass, 376.70 Differenz. Wie kommt das zustande?

@nezzcarth
Wäre ich mit meinem Kenntnisstand nicht drauf gekommen, aber es sieht verständlich aus.
gezett
User
Beiträge: 11
Registriert: Samstag 29. August 2020, 22:56

So ist es dann wohl richtig:

Code: Alles auswählen

betrag = 100 * 1.03 * 12
summe = 0

for jahr in range(2021, 2030):
    betrag *= 1.03
    summe += betrag
    print(f"{jahr}, eingezahlt: {betrag:.2f} Euro")
    
print(f"Gesamt: {summe:.2f} Euro")
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Ob das richtig ist, mußt Du ja selbst wissen, wie Deine Aufgabe ist. Ich würde sagen, so ganz richtig ist das auch nicht.
Antworten