# Zinsberechnung - Fehler im Code



## gabrielaanliker (22. Okt 2017)

Hallo Zusammen,
Der Zweck meines Codes sollte sein, die Anzahl Jahre zu berechnen und auszugeben, die es benötigt beim Startkapital K (wird vom User über Keyboard eingegeben) mit 5% Zins pro Jahr auf 10'000.- zu kommen.
Wenn der User 1 oder weniger eingibt, sollte die Console -1 ausgeben, da es mit diesem Startkapital nicht möglich ist.

Jetzt habe ich das zuerst mit einem Schreibtischtest mal versucht zu konstruieren und in Java umgesetzt und wie ihr bestimmt auf den ersten Blick erkennen könnt. Funktioniert es nicht und ich bin ratlos weswegen. Einerseits motzt der Compiler wegen meiner If-Anweisung, das es ein ungültiges Package ist und wenn ich es dann doch i-wie compilieren kann, gibt es mir den Wert years nicht. Und wenn ich return years; schreibe, motzt der Compiler, years sei ein "unexpectet value to return".

Könnt ihr mir helfen? Danke.


```
public class Zinsrechnung {
  public static void main (String []args){
    int k=Integer.parseInt(args[0]);
    double sum= 0;
    int years= 0;
    double z= 0;
    if(k<=1) {System.out.print("-1");}
    else{
     
        while(sum<=10000){
          z=k*5/100;
          sum=z+k;
          years=years+1;
          return;
        }
      }
   
    System.out.print(years+"Jahre sparen um CHF 10'000.- zu erreichen");
  }
}
```


----------



## JStein52 (22. Okt 2017)

Weisst du denn was return macht ? Speziell in deiner Methode main ?
Ich vermute mal du willst deine Schleife beenden und dahinter weitermachen. Und das geht mit break;


----------



## gabrielaanliker (22. Okt 2017)

ich wollte, respektiv dachte, dass return years, den neu berechneten Wert nach jedem Schlaufendurchgang (bis while-Bedingung erfüllt ist) zurück gibt.
Oder anders gesagt, ich versuche die Anzahl Jahre analog der Anzahl Schlaufendurchgänge zu berechnen.


----------



## JStein52 (22. Okt 2017)

Nein, return verlässt die Methode in der du bist. Und das ist hier die main-Methode, d.h. das Programm beendet sich.
Und deine Zinsformel ist irgendwie falsch oder ich verstehe nicht was du rechnest.
Das Kapital nach n Jahren bei einem Startkapital von K0 und einem Zinsatz von p errechnet sich:
Kn = K0 * (1+p)^n

Richtig wäre dann so was:

```
public class ZinsBerechnung {

    public static void main(String[] args) {
        int K0 = 3000;     // das Startkapital
        double Kn = 0;    // das Kapital nach n Jahren
        int years = 1;    // wir beginnen mit 1 Jahr
        double z = 0.05;  // 5% Zins
        if (K0 <= 1) {
            System.out.print("-1");
        } else {

            while (Kn <= 10000) {
                Kn = K0 * Math.pow(1 + z, years);
                years = years + 1;
            }
        }

        System.out.print(years + "Jahre sparen um CHF 10'000.- zu erreichen");
    }
}
```


----------



## gabrielaanliker (22. Okt 2017)

ich habe nicht die Kapitalzinsformel genommen, sondern berechne bei der variablen z wie viel Zins in CHF  ich im Jahr erhalte für gegebenes Startkapital, das mit 5% verzinst wird und addiere das so lange mit dem Startkapital bis ich auf 10'000.- komme. Ist denn nun return das einzige Problem, dass es mir die Anzahl years nicht anzeigt?


----------



## JStein52 (22. Okt 2017)

Wenn deine Berechnung so wie du es beschreibst stimmt ist es das einzige Problem weil er ja gleich beim ersten Schleifendurchlauf das Programm beendet. Ich habe allerdings deine Berechnung nicht getestet weil ich nicht wusste was du da machst. streiche einfach die Zeile mit return ersatzlos


----------



## JStein52 (22. Okt 2017)

gabrielaanliker hat gesagt.:


> z=k*5/100;
> sum=z+k;


Aber kommt denn hier nicht bei jedem Schleifendurchlauf das gleiche raus ? Also eine Endlosschleife ?


----------



## JStein52 (22. Okt 2017)

Ich habe es mir nochmal angeschaut und du müsstest es so machen:

```
while (k <= 10000) {
                k = k + k*z;
                years = years + 1;
            }
```
Du musst erstens die Zinsen immer zum Kapital dazuaddieren und zweitens in jedem Jahr die Zinsen vom aktuellen Kapital berechnen.


----------



## Xyz1 (23. Okt 2017)

Das sollte so auch:

```
private static float knOhneZinseszins(float k0, float p, float n) {
        return (float) (k0 + (k0 * p / 100.0) * n);
    }
    private static float knMitZinseszins(float k0, float p, float n) {
        return (float) (k0 * Math.pow(1.0 + p / 100.0, n));
    }
    private static float nOhneZinseszins(float k0, float p, float kn) {
        return (float) ((kn - k0) / (k0 * p / 100.0));
    }
    private static float nMitZinseszins(float k0, float p, float kn) {
        return (float) (Math.log(kn / k0) / Math.log(1.0 + p / 100.0));
    }
```

Das ist die Zinseszins-Formel, das ist NICHT die Sparkassenformel.

Aber evtl kann mir jemand helfen, ich bekomme, aufgerufen mit

```
knOhneZinseszins(1000, 5, 50);
knMitZinseszins(1000, 5, 50);
nOhneZinseszins(1000, 5, 3500);
nMitZinseszins(1000, 5, 11467.4f);
```


```
3500.0
11467.399
50.0
50.0
```

Aber der zweite Wert soll doch nicht 11467.399 sein, sondern genauer 11467.4. 
Wo entsteht die Ungenauigkeit, bei Berechnung des Zinsfußes???


----------



## JStein52 (23. Okt 2017)

DerWissende hat gesagt.:


> soll doch nicht 11467.399 sein, sondern genauer 11467.4


Wer sagt dass dies der genaue Wert ist ? Mein Taschenrechner sagt 11467,3997857536760348514


----------



## Xyz1 (23. Okt 2017)

JStein52 hat gesagt.:


> Wer sagt dass dies der genaue Wert ist ? Mein Taschenrechner sagt 11467,3997857536760348514


Das steht so auf Wikipedia  : https://de.wikipedia.org/wiki/Zinseszins#Mit_Zinseszins

Sorry! Ich habe es nicht nachgerechnet!

Bearbeitung: Das stimmt mit 11467,3997... mein Taschenrechner sagt das auch...


----------



## Trjavnamen (24. Okt 2017)

das Taschenrechnerergebnis  ist nur mit Modula zu erreichen 11467,3997857536760348514  um einen Wert mit 2 Nachkommatellen zu bekommen  aber auf 3 stellen auszurechnen  müßte man erst alles auf mit 100 multiplizierren um mit Mat.cell zu runden und dann durch 100 zu teilen.
l


----------



## JStein52 (24. Okt 2017)

gabrielaanliker hat gesagt.:


> Der Zweck meines Codes sollte sein, die Anzahl Jahre zu berechnen und auszugeben, die es benötigt beim Startkapital K (wird vom User über Keyboard eingegeben) mit 5% Zins pro Jahr auf 10'000.- zu kommen


Ich glaube dazu braucht man keine 3 oder 10 Stellen hinter dem Komma


----------



## Xyz1 (24. Okt 2017)

Trjavnamen hat gesagt.:


> ist nur mit Modula zu erreichen


Modula? Ich weiß leider nicht zu 100 % jenau was du damit meinst.

...Die Anzahl der Jahre... dann muss natürlich noch aufgerundet werden immer.

Wahrscheinlich ist die Übung so gedacht, das man Schleifen usw übt. Dann ist das rechnerische Ermitteln nicht angebracht.

Aber ist doch jetzt gut, '11467,39....' und ich hatte auf Darstellungs Rundungs oder Rechenfehler getippt. Falsch gedacht.


----------



## JStein52 (24. Okt 2017)

DerWissende hat gesagt.:


> Ich weiß leider nicht zu 100 % jenau was du damit meinst.


Ist eine Programmiersprache. Sowas von tot. Keine Ahnung warum er damit hier ankam ?


----------



## Trjavnamen (24. Okt 2017)

```
public class Zinsberechnung {
  
     public static void main (String []args){
           int k=Integer.parseInt(args[0]);
          int sum= k;//
           int years= 0;//jahre
          int z= 5;//Zinssatz
         int zinsen =0;
          
           while(sum <=10000){
              
               zinsen=(sum*z)/100;
               sum=zinsen+sum; 
                 years=years+1;
                 System.out.println(k);
                 System.out.println(years);
                 System.out.println(zinsen);
                 System.out.println(sum);
                 }
          System.out.print(years+"Jahre sparen um CHF 10'000.- zu erreichen");
```
5000 Kapitaleinsatz
15 Years
494 letzte Rate
10383 erreichtes kapital
15Jahre sparen um CHF 10'000.- zu erreichen


----------



## Xyz1 (24. Okt 2017)

Hallo @Trjavnamen ,
das würde mit dem auf der anderen Seite genannten Zinsfußes genauer gehen - denn du addierst....
In meiner Sig. steht beschrieben , wie du Code-Tags verwenden kannst.


----------



## Trjavnamen (24. Okt 2017)

```
package zinsen;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Zinsberechnung {
   
      public static void main (String []args){
            int k=Integer.parseInt(args[0]);
           int sum= k;////anfangssumme für zinsberechnung
            int years= 0;//jahre
           int z= 5;//Zinssatz
          int zinsen =0;
           
            while(sum-k <=9999){
               
                zinsen=(sum*z)/100;
                sum=zinsen+sum; 
                  years=years+1;
                  System.out.println(k);
                  System.out.println(years);
                  System.out.println(zinsen);
                  System.out.println(sum);
                  }
           System.out.print(years+"Jahre sparen um CHF 10'000.- zu erreichen");
            
               
                
                   
                
              }
           
              }
```


----------



## Trjavnamen (24. Okt 2017)

habe den schlüssel gedrückt und den Code kopiert aber selbe ergebnis


----------



## JStein52 (24. Okt 2017)

Ich glaube nicht dass das stimmt was du da oben gerechnet hast


----------



## JStein52 (24. Okt 2017)

Es sind 16 Jahre und das Kapital sind dann 10394.64 CHF


----------



## JStein52 (24. Okt 2017)

```
double K0 = 5000.0;     // das Startkapital
        int years = 0;    // wir beginnen mit 1 Jahr
        double z = 0.05;  // 5% Zins
        while (K0 <= 10000) {
            K0 = K0 + K0 * z;
            years = years + 1;
        }
        System.out.println(years + "Jahre sparen um CHF 10'000.- (" + K0 + ") zu erreichen");
```
Aber habe mich verschrieben, 15 Jahre war schon richtig !


----------



## Xyz1 (24. Okt 2017)

Das von Trjavnamen ist kompletter Nonsense.... `int` wird ja auch verwendet

@Trjavnamen : Code-Tags!


----------



## Xyz1 (24. Okt 2017)

JStein52 hat gesagt.:


> Aber habe mich verschrieben,


Bitte mit dem Zinsfuß q rechnen!


----------



## JStein52 (24. Okt 2017)

DerWissende hat gesagt.:


> Bitte mit dem Zinsfuß q rechnen!


Was ist der Zinsfuss ?


----------



## Trjavnamen (24. Okt 2017)

mit 7,5 Zinseszins ist erfahrungsgemäß nach 10 Jahren das Doppelte angespahrt.In der Umgekehrten Logik ist ein Kredit ohne Zinsabtragung  nach 10 Jahren doppelt so hoch. Banken rechnen vierteljährlich ab: Kredit + Zinsen für Kredit auf 3 Monate - gezahlte  Abschlagszahlung +Kontogebühren = neuer Kreditbetrag. Wird nachträglich die Abschlagssumme geändert kann es passieren das der rückzuzahlende Kredit erhöht wird(anfallende Zinsen schlucken die Rückzahlung und mehr) . Die letzte Weltwirtschaftskriese ist durch die Zinspolitik der Amerikanischen Banken ausgelöst worden. Anstatt 3.5% für Krediete verlangten sie einfach 7.5% was jedem Deutschen im Prinzip ebenfalls treffen kann mit max.10 Jahre Laufzeit festschreibung  auf Zinsfuß. Leute die heute 1% bezahlen und bei der Bank ohne Bauspahrvertrag arbeiten können in zehn Jahren einen so hohen Zinssatz bekommen das sie schlichtweg in Schulden versinken.


----------



## Trjavnamen (24. Okt 2017)

zinsfuß =zinssatz in % auf einen Zeitraum festgesetzt(meist 10 Jahre)


----------



## Xyz1 (25. Okt 2017)

JStein52 hat gesagt.:


> Was ist der Zinsfuss


Zinsen = 5 (%)
Zinsfuß = p = 5/100 = 0,05
Zinsfaktor = q = 1 + 5/100 = 1,05
Habe ich das jetzt aufgefasst. Mit dem Zinsfaktor ists angenehmer zu rechnen. Kann auch berechnet werden durch (100+5)/100.

@Trjavnamen , wahrscheinlich Quatsch. Der Zinssatz müsste 100(2^(1/10)-1)=7.1773462536293164213... betragen , damit sich nach 10 Jahren alles verdoppelt. Aber gern gelesen.


----------



## Meniskusschaden (25. Okt 2017)

DerWissende hat gesagt.:


> Zinsen = 5 (%)


Die 5% sind meines Erachtens nicht die Zinsen, sondern der Zinssatz.


DerWissende hat gesagt.:


> Zinsfuß = p = 5/100 = 0,05


Der Zinsfuß wäre dann p = 5% * 100 = 5.


----------



## JStein52 (25. Okt 2017)

DerWissende hat gesagt.:


> Der Zinssatz müsste 100(2^(1/10)-1)=7.1773462536293164213... betragen , damit sich nach 10 Jahren alles verdoppelt


exakt ! 


Trjavnamen hat gesagt.:


> mit 7,5 Zinseszins ist erfahrungsgemäß nach 10 Jahren das Doppelte angespahrt.


Wieso erfahrungsgemäss ? Das lässt sich genau ausrechnen 
Im Übrigen artet das Ganze hier wohl etwas aus. Zur Berechnung wurde bereits alles gesagt und die TE wird sich inzwischen kaputtlachen


----------



## Trjavnamen (25. Okt 2017)

haha 5% von 100€ sind 5€=  5%Zinssen=5€ Im erstgenannten Fall für das erste Jahr 5% von10 000 gleich 500 bei im 2 Jahr 5% von 10500 =525 € usw. bei Zinsfuß, Zinsatz (und im Volksmund 5%Zinsen)wobei das ausschreiben von diesem Zeichen"%" es immer ein Prozentsatz ist.


----------



## JStein52 (25. Okt 2017)

Gut dass wir da mal drüber geredet haben ! Aber kann man nicht bei


Trjavnamen hat gesagt.:


> ... 5€= 5%Zinssen=5€ ...


 den mittleren Teil auch weglassen und vereinfacht schreiben:
5€ = 5€  ??


----------



## Trjavnamen (25. Okt 2017)

package zinsen;

public class Zinsberechnung {

	  public static void main (String []args){
		    int k=Integer.parseInt(args[0]);
		 double sum= k;////anfangssumme für zinsberechnung
		   double years= 0.0;//jahre
		   double z= 5.0;//Zinssatz ohne %zeichen
		  double zinsen =0.0;// die resultierende Zinsen Betrag
		   double zinsenR =0.0; //die gerundeten Zinsen 
		    while(sum-k <=10000.00){

		    	zinsen=(sum*z)/100;//	AUSRECHNEN DER ZINSEN
		    	zinsenR =(( Math.ceil(zinsen*100))/100); //Runden
		        sum=zinsenR+sum;  // ADDIEREN ALTE SUM ZUR NEUEN SUM

		          years=years+1;
		          System.out.println(k);
		          System.out.println(years);
		          System.out.println(zinsenR);
		          System.out.println(sum);

		          }
		   System.out.print(years+"Jahre sparen um CHF 10'000.- zu erreichen");





		      }

		      }


----------



## Trjavnamen (25. Okt 2017)

Alles mit Double ausgerechnet. Programm hat den Vorteil das man auch zinsatz mit Kommastelle eintragen kann.PS in der console kann man nach oben scrollen und die Berechnung vom ersten bis zum letzten Jahr sehen.


----------



## Trjavnamen (25. Okt 2017)

Hallo @JStein52 ja natürlich aber ich liebe Subtieles und Wiederholungen solange man nicht meint "ich kaufe für 1 Euro und verkaufe für 3€uro und von diesen 3% lebe ich.


----------



## Xyz1 (25. Okt 2017)

Das ist ja unter aller ...


Trjavnamen hat gesagt.:


> Alles mit Double ausgerechnet


Tipp: Du inkrementierst da `double`s!!!!


----------

