Hi ich beschäftige mich schon seit 1 Woche mit Java und arbeite gerade die Insel durch. Da gab es ja so eine Aufgabe zum Thema Zinsrechnung und ich hab einfach mal einen Zinsrechner gebaut.
Java:
package myinterestrates;importjava.util.*;publicclassMyInterestRates{publicstaticvoidmain(String[] args){double capital2;//capital+totalInterestdouble i;//monthly precentual interest increasedouble helpCapital;//Just a helping variable in my for-loopSystem.out.println("Kapital in Euro?");double capital=newScanner(System.in ).nextDouble();System.out.println("Jährlicher Zinssatz in Prozent?");double interestRate=newScanner(System.in ).nextDouble();System.out.println("Anlagedauer in Monaten?");int m=newScanner(System.in ).nextInt();System.out.println("Werden die Zinsen monatlich oder jährlich ausbezahlt");String monthlyOrYearly=newScanner(System.in ).nextLine();if(monthlyOrYearly="monatlich"){//Java doesn't accept strings in if clause apparantlydouble actualInterestRate =( interestRate /100)+1;
capital * actualInterestRate = capital *(1+ i )^m;//solve after i. but how?
helpCapital=capital;for(int z=0; z<m; z++){//using for loop to get the zinseszins
helpCapital *( i +1);}}elseif(monthlyOrYearly="jährlich"){//just calculate that yearly zins thing}else{//here I wanna give an error message if the word entered in my Scanner is not//"monthly" or "yearly"}}}
Der Code ist noch nicht ganz fertig!
Aber trotzdem kriege ich schon einige Fehlermeldungen :O.
1. Frage: Wie kann ich den String den ich vom Scanner bekomme "monatlich" oder "jährlich" in eine If einbauen?
2.Frage: Meine Formel "capital * actualInterestRate = capital * ( 1 + i )^m; " dürfte soweit stimmen, aber ich weiß schon, dass es das "^" nicht gibt in Java, naja hab es mal trotzdem verwendet damit jeder weiß was ich meine.
Wie löse ich das jetzt nach i auf? Ich muss ja im Prinzip die m-te Wurzel ziehen, aber wie geht das nochmal . Hilfeeee
So Leute ich hab meinen code mal geupdated (ist leider nicht alles auf meinem Mist gewachsen, aber ich hab es wenigstens verstanden):
Java:
package myinterestrates;importjava.util.*;publicclassMyInterestRates_1{publicstaticvoidmain(String[] args){double capital2;//capital+totalInterest System.out.println("Kapital in Euro?");double capital =newScanner(System.in).nextDouble();System.out.println("Jährlicher Zinssatz in Prozent?");double interestRate =newScanner(System.in).nextDouble();System.out.println("Anlagedauer in Monaten?");int months =newScanner(System.in).nextInt();System.out.println("Werden die Zinsen monatlich oder jährlich ausbezahlt");String monthlyOrYearly =newScanner(System.in).nextLine();double newInterestRate = interestRate /100+1;double interestRate2 = interestRate;double newInterestRateYearly = interestRate2 /(100*12)+1;double monatPotenz =Math.pow(newInterestRate,1.0/12);//System.out.println(potenz);double newCapital = capital;double newCapital2 = capital;if(monthlyOrYearly.equalsIgnoreCase("monatlich")){for(int z =0; z < months; z++){
newCapital = newCapital * monatPotenz;}System.out.println("Sie haben "+ capital +" Euro. Nach der Anlagedauer von "+ months +" Monaten haben Sie "+ newCapital +".");}elseif(monthlyOrYearly.equalsIgnoreCase("jährlich")){for(int z =0; z < months; z++){
newCapital2 = newCapital2 * newInterestRateYearly;}System.out.println("Sie haben "+ capital +" Euro. Nach der Anlagedauer von "+ months +" Monaten haben Sie "+ newCapital2 +".");}else{System.out.println("Geben sie bitte monatlich oder jährlich als Auszahlungsperiode an.");}}}
Bin schon relativ zufrieden mit dem Code, vielleicht hätte ich meine Variablen eindeutiger definieren können, aber das ist gar nicht das Hauptproblem.
Das Hauptproblem ist, dass ich bei meiner else if clause einen ziemlichen Rundungsfehler bekomme und ich irgendwie nicht weiß wie ich den rauskriege, weil grundsätzlich ja meine Rechnung stimmt.
Generell sollte man bei Währungen nicht mit double rechnen. Da bekommst du immer Fehler. Währung rechnet man immer in cent oder wenn man noch runden muss in 1/10cent. Damit hast du eine int und keine Rundungsfehler.
Allgemein sollte man Geldbeträge (wenn die Anwendung tatsächlich auch für sowas eingesetzt wird) niemals selber programmieren! Die Mathematik und Fehlerquellen werden dabei oft unterschätzt. Besser ist es man verwendet getstete Standards, wie zb die JSR 354 (http://javamoney.github.io/).
Ah okay, ja ich krieg auch kleine Rundungsfehler, weil mit double gerechnet wird, aber das ist nicht weiter schlimm, weil ein Einsatz dieser "Software" niemals in Betracht kommen würde.
Ist eigentlich nur eine kleine Übungsaufgabe gewesen.
für diejenigen die es interessiert, hier ist der working code für den "Zinsrechner mit Rundungsfehlern":
Java:
package myinterestrates;//Paketnameimportjava.util.*;//ImportanweisungenpublicclassMyInterestRates_1//Name der Klasse{publicstaticvoidmain(String[] args){System.out.println("Kapital in Euro?");//Die Konsole gibt "Kapital in Euro?" ausdouble capital=newScanner(System.in ).nextDouble();//Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugebenSystem.out.println("Jährlicher Zinssatz in Prozent?");//Die Konsole gibt "Jährlicher Zinssatz in Prozent?" ausdouble interestRate=newScanner(System.in ).nextDouble();//Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugebenSystem.out.println("Anlagedauer in Monaten?");//Die Konsole gibt "Anlagedauer in Monaten?" ausint months=newScanner(System.in ).nextInt();//Der Benutzer wird darum gebeten einen Wert vom Datentyp int einzugebenSystem.out.println("Werden die Zinsen monatlich oder jährlich ausbezahlt?");//Die Konsole gibt "Werden die Zinsen monatlich oder jährlich ausbezahlt" ausString monthlyOrYearly=newScanner(System.in ).nextLine();//Der Benutzer wird darum gebeten einen Wert vom Typ String einzugebendouble helpCapital=capital;//Hilfsvariable bekommt den momentanen Wert von der Variable capital zugewiesendouble helpCapital2=capital;//Hilfsvariable2 bekommt den momentanen Wer von der Variable capital zugewiesendouble shapedInterestRate= interestRate/100+1;//Die Variable interestRate wird umgeformt, damit wir besser mit ihr rechnen könnendouble monthlyExpCapitalGrowth=Math.pow(shapedInterestRate,1.0/12);//Rechnung um den unterjährigen Zinssatz zu berechnendouble i=interestRate;//Der Hilfsvariable i wird der momentane Wert von interestRate zugewiesendouble linearInterestRatePerMonth= i/(100*12);//Rechnung um auf den prozentualen linearen Zinssatz zu kommen//die monatlichen Zinsen werden berechnet//System.out.println(monthlyLinCapitalGrowth);if(monthlyOrYearly.equalsIgnoreCase("monatlich")){//if-Abfrage wird gestartetfor(int z=0; z<months; z++){//for-Schleife wird gestartet
helpCapital = helpCapital * monthlyExpCapitalGrowth;//Formel zur Berechnung des (Zinses)Zins}//Ende der for-SchleifeSystem.out.println("Sie haben "+ capital +" Euro. Nach der Anlagedauer von "+ months +" Monaten haben Sie "+ helpCapital +" Euro.");}elseif(monthlyOrYearly.equalsIgnoreCase("jährlich")){//Die else-if Anweisung wird gestartet wenn der Benutzer "jährlich" eingibtfor(int z=0; z<months; z++){
helpCapital2 = helpCapital2 +( capital * linearInterestRatePerMonth );}System.out.println("Sie haben "+ capital +" Euro. Nach der Anlagedauer von "+ months +" Monaten haben Sie "+ helpCapital2+" Euro.");}else{//Die else Anweisung wird gestartet wenn ein unzulässiger Text eingegeben wirdSystem.out.println("Geben sie bitte monatlich oder jährlich als Auszahlungsperiode an.");}}}
ich hab dir das mal berichtigt und validiert, bei mir rechnet er nicht falsch:
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/package javaapplication5;importjava.util.*;/**
* @author DW on 2016/09/07
*/publicclassJavaApplication5{/**
* Calcs some things ....
*
* @param args images a, b, and c.
* @throws java.io.IOException
*/publicstaticvoidmain(String[] args){System.out.println("Kapital in Euro?");//Die Konsole gibt "Kapital in Euro?" ausdouble capital =newScanner(System.in).nextDouble();//Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugebenSystem.out.println("Jährlicher Zinssatz in Prozent?");//Die Konsole gibt "Jährlicher Zinssatz in Prozent?" ausdouble interestRate =newScanner(System.in).nextDouble();//Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugebenSystem.out.println("Anlagedauer in Monaten?");//Die Konsole gibt "Anlagedauer in Monaten?" ausint months =newScanner(System.in).nextInt();//Der Benutzer wird darum gebeten einen Wert vom Datentyp int einzugebenSystem.out.println("Werden die Zinsen monatlich oder jaehrlich ausbezahlt?");//Die Konsole gibt "Werden die Zinsen monatlich oder jährlich ausbezahlt" ausString monthlyOrYearly =newScanner(System.in).nextLine();//Der Benutzer wird darum gebeten einen Wert vom Typ String einzugebendouble newCapital = capital;//die monatlichen Zinsen werden berechnet//System.out.println(monthlyLinCapitalGrowth);if(monthlyOrYearly.equalsIgnoreCase("monatlich")){//if-Abfrage wird gestartetfor(int i =0; i < months; i++){
newCapital += newCapital * interestRate /(100*12);}//Ende der for-SchleifeSystem.out.println("Sie haben "+ capital +" Euro. Nach der Anlagedauer von "+ months +" Monaten haben Sie "+ newCapital +" Euro.");}elseif(monthlyOrYearly.equalsIgnoreCase("jaehrlich")){//Die else-if Anweisung wird gestartet wenn der Benutzer "jährlich" eingibtfor(int i =0; i < months /12; i++){
newCapital += newCapital * interestRate /100;}
newCapital += newCapital * interestRate /(100*12)*(months %12);System.out.println("Sie haben "+ capital +" Euro. Nach der Anlagedauer von "+ months +" Monaten haben Sie "+ newCapital +" Euro.");}else{//Die else Anweisung wird gestartet wenn ein unzulässiger Text eingegeben wirdSystem.out.println("Geben sie bitte monatlich oder jaehrlich als Auszahlungsperiode an.");}}}
Code:
Kapital in Euro?
1500
Jährlicher Zinssatz in Prozent?
5
Anlagedauer in Monaten?
600
Werden die Zinsen monatlich oder jaehrlich ausbezahlt?
jaehrlich
Sie haben 1500.0 Euro. Nach der Anlagedauer von 600 Monaten haben Sie 17201.09967863051 Euro.
--
Kapital in Euro?
1500
Jährlicher Zinssatz in Prozent?
5
Anlagedauer in Monaten?
601
Werden die Zinsen monatlich oder jaehrlich ausbezahlt?
jaehrlich
Sie haben 1500.0 Euro. Nach der Anlagedauer von 601 Monaten haben Sie 17272.770927291473 Euro.
--
Kapital in Euro?
1500
Jährlicher Zinssatz in Prozent?
5
Anlagedauer in Monaten?
606
Werden die Zinsen monatlich oder jaehrlich ausbezahlt?
jaehrlich
Sie haben 1500.0 Euro. Nach der Anlagedauer von 606 Monaten haben Sie 17631.127170596275 Euro.
----
Kapital in Euro?
1500
Jährlicher Zinssatz in Prozent?
5
Anlagedauer in Monaten?
600
Werden die Zinsen monatlich oder jaehrlich ausbezahlt?
monatlich
Sie haben 1500.0 Euro. Nach der Anlagedauer von 600 Monaten haben Sie 18179.07481710924 Euro.
--
Kapital in Euro?
1500
Jährlicher Zinssatz in Prozent?
5
Anlagedauer in Monaten?
601
Werden die Zinsen monatlich oder jaehrlich ausbezahlt?
monatlich
Sie haben 1500.0 Euro. Nach der Anlagedauer von 601 Monaten haben Sie 18254.820962180525 Euro.
--
Kapital in Euro?
1500
Jährlicher Zinssatz in Prozent?
5
Anlagedauer in Monaten?
606
Werden die Zinsen monatlich oder jaehrlich ausbezahlt?
monatlich
Sie haben 1500.0 Euro. Nach der Anlagedauer von 606 Monaten haben Sie 18638.312204675647 Euro.
Ich kann dir nicht zu 100 % richtig sagen, ob die Sparkasse das bei MONATLICHER Verzinsung genau so rechnet. (jährliche Verzinsung ist Ok)
Zur eigentlichen Frage, wie vergleicht man Strings, genauso.
Wie kann ich auch runden auf Centbeträge, das kostete extra Geld.
Sollte ich Scanner so verwenden? NEIN.
Sind obige Kommentare nützlich. Naja. :/
Bitte gib mir mal 'ne kurze Rückmeldung, ob dein Zinseszinsrechner deiner Bank dasselbe zurückgibt.
Ich weiß, dass 5 % (für die Sparkasse) utopisch ist. Aber ich wollte, dass sich der Wert wenigstens etwas ändert. Das ist natürlich noch nicht inflationsbereinigt.
BTW ist mir aufgefallen, dass man das mit double nicht genauer berechnen kann - also etwa genau bis zur zehnten Nachkommastelle. Cents sind im Bankengeschäft aber auch völlig Wurst. Andere Geschütze wollte ich nu nicht auffahren.
Ich weiß, dass es nicht in deinen Produktivcode einfließen wird, aber könntest du bitte genausten darlegen, was du mit monatlicher Verzinsung beim jährlichen Zinssatz meinst? Bei monatlicher Verzinsung hab ich ein paar Euro mehr, ich bin begeistert. (Weil die Bank bei unganzen Jahren nicht die Mogelkarte ziehen kann)
Das Wachstum ist natürlich nicht linear? Wieso nicht die Formel nehmen, welche seit 5000 Jahren bekannt ist?
Java:
for(int i =0; i < months; i++){
newCapital += newCapital * interestRate /(100*12);}...for(int i =0; i < months /12; i++){
newCapital += newCapital * interestRate /100;}
newCapital += newCapital * interestRate /(100*12)*(months %12);
oder auch
newCapital += newCapital * interestRate *(months %12)/(100*12);
aber nicht genauer
Sooooooooo - ich möchte wissen, ob ersterer Fall (monatliche Verzinsung/Ausschüttung bei jährlichem Zinssatz) genau das ist, was dir oder deiner Bank vorschwebt.
Bitte versteh mich nicht falsch, nichts für ungut.