Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Erste SchritteWie kann ich einen String in eine If einbauen :)?
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;
import java.util.*;
public class MyInterestRates {
public static void main(String[] args){
double capital2; //capital+totalInterest
double i; //monthly precentual interest increase
double helpCapital; //Just a helping variable in my for-loop
System.out.println("Kapital in Euro?");
double capital= new Scanner( System.in ).nextDouble();
System.out.println("Jährlicher Zinssatz in Prozent?");
double interestRate= new Scanner( System.in ).nextDouble();
System.out.println("Anlagedauer in Monaten?");
int m= new Scanner( System.in ).nextInt();
System.out.println("Werden die Zinsen monatlich oder jährlich ausbezahlt");
String monthlyOrYearly=new Scanner(System.in ).nextLine();
if (monthlyOrYearly="monatlich") { //Java doesn't accept strings in if clause apparantly
double 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 );
}
} else if (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;
import java.util.*;
public class MyInterestRates_1 {
public static void main(String[] args) {
double capital2; //capital+totalInterest
System.out.println("Kapital in Euro?");
double capital = new Scanner(System.in).nextDouble();
System.out.println("Jährlicher Zinssatz in Prozent?");
double interestRate = new Scanner(System.in).nextDouble();
System.out.println("Anlagedauer in Monaten?");
int months = new Scanner(System.in).nextInt();
System.out.println("Werden die Zinsen monatlich oder jährlich ausbezahlt");
String monthlyOrYearly = new Scanner(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 + ".");
} else if (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; //Paketname
import java.util.*; //Importanweisungen
public class MyInterestRates_1 //Name der Klasse
{
public static void main(String[] args){
System.out.println("Kapital in Euro?"); //Die Konsole gibt "Kapital in Euro?" aus
double capital= new Scanner( System.in ).nextDouble(); //Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugeben
System.out.println("Jährlicher Zinssatz in Prozent?"); //Die Konsole gibt "Jährlicher Zinssatz in Prozent?" aus
double interestRate= new Scanner( System.in ).nextDouble(); //Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugeben
System.out.println("Anlagedauer in Monaten?"); //Die Konsole gibt "Anlagedauer in Monaten?" aus
int months= new Scanner( System.in ).nextInt(); //Der Benutzer wird darum gebeten einen Wert vom Datentyp int einzugeben
System.out.println("Werden die Zinsen monatlich oder jährlich ausbezahlt?"); //Die Konsole gibt "Werden die Zinsen monatlich oder jährlich ausbezahlt" aus
String monthlyOrYearly=new Scanner(System.in ).nextLine(); //Der Benutzer wird darum gebeten einen Wert vom Typ String einzugeben
double helpCapital=capital; //Hilfsvariable bekommt den momentanen Wert von der Variable capital zugewiesen
double helpCapital2=capital; //Hilfsvariable2 bekommt den momentanen Wer von der Variable capital zugewiesen
double shapedInterestRate= interestRate/100+1; //Die Variable interestRate wird umgeformt, damit wir besser mit ihr rechnen können
double monthlyExpCapitalGrowth=Math.pow(shapedInterestRate, 1.0/12); //Rechnung um den unterjährigen Zinssatz zu berechnen
double i=interestRate; //Der Hilfsvariable i wird der momentane Wert von interestRate zugewiesen
double 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 gestartet
for (int z=0; z<months; z++) { //for-Schleife wird gestartet
helpCapital = helpCapital * monthlyExpCapitalGrowth; //Formel zur Berechnung des (Zinses)Zins
} //Ende der for-Schleife
System.out.println("Sie haben " + capital + " Euro. Nach der Anlagedauer von "+ months + " Monaten haben Sie "
+ helpCapital + " Euro.");
} else if (monthlyOrYearly.equalsIgnoreCase("jährlich")) { //Die else-if Anweisung wird gestartet wenn der Benutzer "jährlich" eingibt
for (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 wird
System.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;
import java.util.*;
/**
* @author DW on 2016/09/07
*/
public class JavaApplication5 {
/**
* Calcs some things ....
*
* @param args images a, b, and c.
* @throws java.io.IOException
*/
public static void main(String[] args) {
System.out.println("Kapital in Euro?"); //Die Konsole gibt "Kapital in Euro?" aus
double capital = new Scanner(System.in).nextDouble(); //Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugeben
System.out.println("Jährlicher Zinssatz in Prozent?"); //Die Konsole gibt "Jährlicher Zinssatz in Prozent?" aus
double interestRate = new Scanner(System.in).nextDouble(); //Der Benutzer wird darum gebeten einen Wert vom Datentyp double einzugeben
System.out.println("Anlagedauer in Monaten?"); //Die Konsole gibt "Anlagedauer in Monaten?" aus
int months = new Scanner(System.in).nextInt(); //Der Benutzer wird darum gebeten einen Wert vom Datentyp int einzugeben
System.out.println("Werden die Zinsen monatlich oder jaehrlich ausbezahlt?"); //Die Konsole gibt "Werden die Zinsen monatlich oder jährlich ausbezahlt" aus
String monthlyOrYearly = new Scanner(System.in).nextLine(); //Der Benutzer wird darum gebeten einen Wert vom Typ String einzugeben
double newCapital = capital;
//die monatlichen Zinsen werden berechnet
//System.out.println(monthlyLinCapitalGrowth);
if (monthlyOrYearly.equalsIgnoreCase("monatlich")) { //if-Abfrage wird gestartet
for (int i = 0; i < months; i++) {
newCapital += newCapital * interestRate / (100 * 12);
}
//Ende der for-Schleife
System.out.println("Sie haben " + capital + " Euro. Nach der Anlagedauer von " + months + " Monaten haben Sie "
+ newCapital + " Euro.");
} else if (monthlyOrYearly.equalsIgnoreCase("jaehrlich")) { //Die else-if Anweisung wird gestartet wenn der Benutzer "jährlich" eingibt
for (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 wird
System.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.