Switch-Case zur Berechnung der Einkommensteuer

Sabrina2301

Mitglied
Hallo zusammen,

ich soll mit Hilfe der Case-Struktur den (Grenz-) Steuersatz in 4 Stufen abbilden:

bis 9.999 steuerfrei
10.000 bis 19.999 10 %
20.000 bis 29.999 20 %
ab 30.000 30 %

Die Einkommensteuer soll sich unter Vorgabe des zu versteuernden Einkommens berechnen. Zu beachten ist hierbei, dass es kein deutsches Steuergesetz ist sondern nach dem amerikanischen Prinzip aufgebaut ist. Sprich 9.999 sind immer steuerfrei auch wenn das Einkommen 10.000 beträgt. Wenn das Einkommen 10.000 beträgt muss nur 1 € versteuert werden.

Dies ist auch mein Problem. Bei einem Einkommen von 10.000 € wird in der Console trotzdem 0 € als Einkommensteuer ausgegeben. Wo liegt mein Fehler?

public class Esteuer {

public static double est (int e) {
double esteuer = 0;
int fall;

if (e <= 9999) {
fall = 1;
}
else if ((e >= 10000) && (e < 20000)) {
fall = 2;
}
else if ((e >= 20000) && (e < 30000)) {
fall = 3;
}
else {
fall = 4;
}

switch (fall) {
case 1:
esteuer = 0;
break;
case 2:
e = e-9999;
esteuer = (e*10)/100; //hier noch Fehler mit 0,10 cent
break;
case 3:
esteuer = 10000 * 10 / 100;
esteuer = esteuer + (e-20000)*20 /100;
break;
case 4:
esteuer = 15000 * 20 / 100;
esteuer = esteuer + (e-30000)*30 /100;
break;
}
return esteuer;
}
}


Ausgabe Console:

5000 ,00 ,00 %
6000 ,00 ,00 %
7000 ,00 ,00 %
8000 ,00 ,00 %
9000 ,00 ,00 %
10000 ,00 ,00 %
11000 100,00 ,91 %
 
Bitte immer in Code-Tags posten.
Java:
public class Esteuer {

    public static double est (int e) {
        double esteuer = 0;
        int fall;

        if (e <= 9999) {
            fall = 1;
        }
        else if ((e >= 10000) && (e < 20000)) {
            fall = 2;
        }
        else if ((e >= 20000) && (e < 30000)) {
            fall = 3;
        }
        else {
            fall = 4;
        }

        switch (fall) {
        case 1:
            esteuer = 0;
            break;
        case 2:
            e = e-9999;
            esteuer = (e*10)/100; //hier noch Fehler mit 0,10 cent
            break;
        case 3:
            esteuer = 10000 * 10 / 100;
            esteuer = esteuer + (e-20000)*20 /100;
            break;
        case 4:
            esteuer = 15000 * 20 / 100;
            esteuer = esteuer + (e-30000)*30 /100;
            break;
        }
        return esteuer;
    }
}
Code:
5000 ,00 ,00 %
6000 ,00 ,00 %
7000 ,00 ,00 %
8000 ,00 ,00 %
9000 ,00 ,00 %
10000 ,00 ,00 %
11000 100,00 ,91 %
 
Der Fehler liegt schonmal darin, daß das switch-Statement hier so erstmal Blödsinn ist. Die reine Berechnung und Ausgabe kannst du in den widerlich vielen If-Statements schon machen.
 
Wandle int zu long,
multipliziere mit 10L,
wandle long zu double,
dividiere durch 100.0,
das Ergebnis ist eine so genannte doppelte Fließkommazahl.
 
Mit Enumerationen ist das vielleicht etwas mit Kanonen auf Spatzen, aber dann ist auch das switch-Statement besser lesbar:

Java:
public enum TaxClass {
    FREE(0, 9999, 0),
    CLASS1(10000, 19999, 10),
    CLASS2(20000,29999, 20),
    CLASS3(3000, Integer.MAX_VALUE, 30);
    
    private final int lowerBound;
    private final int upperBound;
    private final int taxRate;

    private TaxClass(int lowerBound, int upperBound, int taxRate) {
        this.lowerBound = lowerBound;
        this.upperBound = upperBound;
        this.taxRate = taxRate;
    }
    
    static TaxClass get(int income){
        for(TaxClass tc : values()){
            if(income >= tc.lowerBound && income <= tc.upperBound){
                return tc;
            }
        }
        return CLASS3;
    }
    
    public int lowerBound(){
        return lowerBound;
    }
    
    public int upperBound(){
        return upperBound;
    }
    
    
    public static void main(String[] args){
        int income = 5000;
        
        TaxClass t = TaxClass.get(income);
        
        System.out.println("Steuersatz: " + t.taxRate + "%");
        
        //Wenn es switch sein muß:
        System.out.print("Mit Switchstatement: ");
        switch(t){
            case FREE:
                System.out.println("0%");
                break;
            case CLASS1:
                System.out.println("10%");
                break;
            case CLASS2:
                System.out.println("20%");
                break;
            case CLASS3:
                System.out.println("30%");
                break;
                default:
                    System.out.println("Du hast vergessen, eine Steuerklasse zu implementieren. Fehler!!!");
                break;
            
        }
    }
}
 
Wieso? So sieht doch der aktuelle Stand aus. Wenn eine vierte Klasse eingeführt werden soll, dann fügst du halt eine Class4 hinzu, änderst den Parameter upperBound von Class3, und alles ist wieder beim Alten. Die Methode get() kann in exakt der gleichen Weise weiterverwendet werden, im Hauptprogramm müßte absolut nichts geändert werden - außer, das Class4 einen weiteren case bekommen muß. Ohne switch wäre das kein Problem.

Oder übersehe ich da was?

Wobei ich noch anfügen will, das ich switch und Enumerationen recht gerne zusammen verwende. In meinem CLS-Projekt habe ich das an verschiedenen Stellen etwa so gelöst wie oben. Und den Fall das nachträglich erweitern zu wollen, hatte ich auch schon mehrmals und ging ohne Kopfzerbrechen. Das geht sogar so gut das ich das auch so mache wenn ich vorher schon genau weiß, daß das noch weiter wachsen wird.
 
Dies ist auch mein Problem. Bei einem Einkommen von 10.000 € wird in der Console trotzdem 0 € als Einkommensteuer ausgegeben
Java:
public class start {
    public static void main(String[] args) {
        TaxIncome.printTax(1000);
        TaxIncome.printTax(10000);
        TaxIncome.printTax(20000);
        TaxIncome.printTax(30000);
    }
}

Java:
public class TaxIncome {
    public static double calculateTaxFactor(int income) {
        if (income <= 9999)
            return 0;
        if (income < 20000)
            return .1;
        if (income < 30000)
            return .2;
        return .3;
    }

    public static double calculateTax(int income) {
        double factor = calculateTaxFactor(income);
        if (factor == 0)
            return 0;
        return (income - 9999) * factor;

    }

    public static void printTax(int income) {
        System.out.println("-----------------------------");
        System.out.println("Income:\t" + "€ " + income);
        double tax = calculateTaxFactor(income);
        System.out.println("Factor:\t" + "% " + tax * 100);
        System.out.println("Total:\t" + "€ " + calculateTax(income));
    }
}
 
Cases verlangen einen konstanten Ausdruck. Wenn in der Aufgabenstellung steht Switches anzuwenden dann ist das die einzigste Variante.
Einmal abgesehen davon, dass switch hier wirklich, so wie @White_Fox korrekt formuliert hat, Blödsinn ist . Kann man das dann aber auch einfacher lösen.
Java:
public static double calculateTaxIncome(int income) {
        int taxLevel;
        for (taxLevel = 1; taxLevel < 4; taxLevel++) {
            if (income < 10000 * taxLevel)
                break;
        }
        income -= 9999;
        switch (taxLevel) {
        case 1:
            return 0;
        case 2:
            return .1*income;
        case 3:
            return .2*income;
        default:
            return .3*income;
        }
    }
PS. Es gibt keine einzigste Variante. Das würde ja bedeuten von all den einzigen Varianten nimmt man die Einzigste (Superlativ ??) . Du meintest wohl die einzige Variante. 😉
 
Mit "einzigste" Variante meinte ich, es ging mir ums Prinzip, die TaxClazz vorher zu berechnen und sie im Switch Case als konstanten Ausdruck einzusetzen. Wie genau diese Berechnung formuliert wird, eigentlich nicht so...

/e Ich weiß natürlich dass ein Superlativ nicht mehr gesteigert werden kann... Persil wäscht so weiß, weißer geht's nicht 😀
 

Neue Themen


Zurück
Oben