Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
vasatom
Člen
Avatar
vasatom:10.11.2013 23:40

zdravím Vás, prosím o radu s chybou v programu, mám daňovou kalkulačku, všechny části mi vychází dobře až na výsledek Souhrna vypoctena dan za uplynuly rok a Prumerny cisty mesicni prijem za uplynuly rok u části kdy je příjem za rok větší než 12*40000(ve zdrojáku ta poslední) . U těchto výstupů jsou jiné výsledky než by měly být. Prosím o radu. díky

  double prijemZaRok = 12*prijem;
        double danZaklad = 12*prijem-krev*4000;
        double danZaklad1 = 12*20000-krev*4000;
        double danZakladNad20 = (prijemZaRok-12*20000)-krev*4000;
        double danZakladNad40 = (prijemZaRok-12*40000)-krev*4000;
        if (danZaklad < 0) danZaklad = 0;

        double mzda ;
        double mzdaDo20;
        double mzdaNad20;
        double mzda2040;
        double mzdaNad40;
        double mzdaCelkNad40;
        double  mzdaNad20000;
        double mzdaDo20000;
        if (prijemZaRok <= 12*20000)
        { mzda =  prijem-(((danZaklad/100)*15)/12);
        double vypoctenaDan = (danZaklad/100)*15;
        System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan );
           System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda );


        }
        else if (prijemZaRok>12*20000 || prijemZaRok<=40000){
            mzdaDo20 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20 = (prijem-20000)-(((danZakladNad20/100)*25)/12);
            mzda2040 = mzdaDo20+mzdaNad20;
            double danZaklad2040 = danZaklad1+danZakladNad20;
            double vypoctenaDan2040 = ((danZaklad1/100)*15)+((danZakladNad20/100)*25);
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad2040 );
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
           System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan2040 );
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda2040 );

        }
        else if (prijemZaRok>12*40000){
        mzdaDo20000 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20000 = (prijem-20000)-(((danZakladNad20/100)*25)/12);
            mzdaNad40 = (prijem-40000)-(((danZakladNad40/100)*35)/12);
            mzdaCelkNad40 = mzdaDo20000+mzdaNad20000+mzdaNad40;
            double danZaklad40 = danZaklad1+danZakladNad20+danZakladNad40;
            double vypoctenaDanNad40 = ((danZaklad1/100)*15)+((danZakladNad20/100)*25)+((danZakladNad40/100)*35);
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad40);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDanNad40);
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelkNad40 );

    }




        // TODO code application logic here
    }

}
 
Odpovědět
10.11.2013 23:40
Avatar
Silvinios
Tvůrce
Avatar
Odpovídá na vasatom
Silvinios:11.11.2013 7:30

O jakou daň se jedná a podle jaké legislativy ji počítáš?

 
Nahoru Odpovědět
11.11.2013 7:30
Avatar
vasatom
Člen
Avatar
Odpovídá na Silvinios
vasatom:11.11.2013 9:09

Ahoj tady je zadání, nefungujou jen ty dva výstupy, jinak ostatní v pohodě

Vytvořte program, který z údajů za uplynulý rok spočte daň. Ve virtualní zemi Bohemland je uzákoněno progresivní danění příjmů. Jedinou odečitatelnou položkou je bezúplatné darování krve nebo krevních derivátů (max. 12 za rok).
o daň nemůže být záporná
o výpočet se provádí tak, že se sečtou příjmy za uplynulý rok a od této sumy se odečte daňová úleva (pdk * 4000)
o tím vznikne daňový základ - ten se pak progresivně daní
o z částky do (12 * 20 000) je sazba 15 %,
o z částky do (12 * 40 000) je sazba 25 %,
o z částky nad (12 * 40 000) je sazba 35 %
o daň se nemůže měnit skokově, tj. např. u hrubého platu 22 000 bez úlev se 25 % platí jen z částky 12 * 2 000 a ze zbývajících 12 * 20 000 se platí jen 15 %
o po rozpočítání daně na jednotlivé měsíce a odečtení od průměrné hrubé mzdy obdržíte průměrný čistý příjem

 
Nahoru Odpovědět
11.11.2013 9:09
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na vasatom
David Hartinger:11.11.2013 9:55

Kdybys rozdělil ten kód do metod, tak bys tu chybu našel. Když všechno nacpeš do jedné nudle, tak se nemůžeš divit, že ti to nefunguje.

Nahoru Odpovědět
11.11.2013 9:55
You are the greatest project you will ever work on.
Avatar
goddard
Člen
Avatar
goddard:11.11.2013 10:57

Projdi si implicitni konverze mezi double a int. krokovani kodu by taky asi pomohlo abys zjistil ve kterem mezi kroku dostanes neocekavanou hodnotu

 
Nahoru Odpovědět
11.11.2013 10:57
Avatar
vasatom
Člen
Avatar
vasatom:11.11.2013 18:56

omlouvám se ale programování mi nejde a vůbec nevím kde tam hledat chybu.Upravil jsem to a teď mi jdou výsledky dobře, když se nezadá počet darování krve, ale například u hodnoty platu 29000 a 5 krát darování krve mi to vyhodí špatné hodnoty. Kdybyste byl někdo tak ochotný se na to podívat?

double prijemZaRok = 12 * prijem;
        double danZaklad = 12 * prijem - krev * 4000;
        double danZaklad1 = 12 * 20000 - krev * 4000;
        double danZakladNad40 = (prijemZaRok - 12 * 40000) - krev * 4000;
        double danZakladNad20 = (prijemZaRok - 12 * 20000) - danZakladNad40 - krev * 4000;
        double danZakladNad20000 = (prijemZaRok - 12 * 20000) - krev * 4000;

        if (danZaklad < 0) {
            danZaklad = 0;
        }
        if (danZaklad1 < 0) {
            danZaklad1 = 0;
        }
        if (danZakladNad20 < 0) {
            danZakladNad20 = 0;
        }
        if (danZakladNad40 < 0) {
            danZakladNad40 = 0;
        }
        if (danZakladNad20000 < 0) {
            danZakladNad20000 = 0;
        }
        double mzda;
        double mzdaDo20;
        double mzdaNad20;
        double mzda2040;
        double mzdaNad40;
        double mzdaCelkNad40;
        double mzdaNad20000;
        double mzdaDo20000;
        if (prijemZaRok <= 12 * 20000) {
            System.out.println("pod20");
            mzda = prijem - (((danZaklad / 100) * 15) / 12);
            double vypoctenaDan = (danZaklad / 100) * 15;
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan);
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda);

        } else {
            if (prijemZaRok > 12 * 20000 && prijemZaRok <= 12 * 40000) {
                System.out.println("nad20");
                mzdaDo20 = 20000 - (((danZaklad1 / 100) * 15) / 12);
                mzdaNad20 = (prijem - 20000) - (((danZakladNad20000 / 100) * 25) / 12);
                mzda2040 = mzdaDo20 + mzdaNad20;
                double danZaklad2040 = danZaklad1 + danZakladNad20000;
                double vypoctenaDan2040 = ((danZaklad1 / 100) * 15) + ((danZakladNad20000 / 100) * 25);
                System.out.println("---Vysledky---");
                System.out.println("Celkovy zaklad dane za uplynuly rok:");
                System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad2040);
                System.out.println("Souhrna vypoctena dan za uplynuly rok:");
                System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan2040);
                System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
                System.out.printf(Locale.US, "%20.2f%n", (double) mzda2040);

            } else {
                System.out.println("nad40");
                mzdaDo20 = 20000 - (((danZaklad1 / 100) * 15) / 12);
                mzdaNad20000 = 20000 - (((danZakladNad20 / 100) * 25) / 12);
                mzdaNad40 = (prijem - 40000) - (((danZakladNad40 / 100) * 35) / 12);
                mzdaCelkNad40 = mzdaDo20 + mzdaNad20000 + mzdaNad40;
                double danZaklad40 = danZaklad1 + danZakladNad20 + danZakladNad40;

                double vypoctenaDanNad40 = ((danZakladNad20 / 100) * 25) + ((danZaklad1 / 100) * 15) + ((danZakladNad40 / 100) * 35);
                System.out.println((danZaklad1 / 100) * 15);
                System.out.println((danZakladNad20 / 100) * 25);
                System.out.println((danZakladNad40 / 100) * 35);
                System.out.println("---Vysledky---");
                System.out.println("Celkovy zaklad dane za uplynuly rok:");
                System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad40);
                System.out.println("Souhrna vypoctena dan za uplynuly rok:");
                System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDanNad40);
                System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
                System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelkNad40);

            }

        }

    }

}
 
Nahoru Odpovědět
11.11.2013 18:56
Avatar
coells
Neregistrovaný
Avatar
coells:12.11.2013 16:39

Chybu máš ve výpočtu daňové meze, kde odpočítáváš krev. Daňová mez je pevně daná, hýbe se pouze hrubým příjmem.

Výhodnější je progresivní daň počítat "zdola". Něco takového?

double CistyMesicniPrijem(double mesicniPrijem, int pocetDarovaniKrve)
{
    double prijmyZaRok = 12 * mesicniPrijem;
    double danovaUleva = (pocetDarovaniKrve > 12) ? 12 * 4000 : pocetDarovaniKrve * 4000;

    double danovyZaklad = prijmyZaRok - danovaUleva;
    if (danovyZaklad < 0)
        danovyZaklad = 0;

    double dan = 0;

    dan += ProgresivniDan(ref danovyZaklad, 12 * 20000, 0.15); // 0 - 20.000, 15%
    dan += ProgresivniDan(ref danovyZaklad, 12 * 20000, 0.25); // 20.000 - 40.000, 25%
    dan += ProgresivniDan(ref danovyZaklad, 0, 0.35); // nad 40.000, 35%

    dan = dan / 12;
    double prumernyCistyPrijem = mesicniPrijem - dan;

    return prumernyCistyPrijem;
}

double ProgresivniDan(ref double danovyZaklad, int danovaMez, double procenta)
{
    double zaklad = danovyZaklad;

    if (danovaMez > 0 && danovyZaklad > danovaMez)
    {
        zaklad = danovaMez;
        danovyZaklad -= danovyZaklad - danovaMez;
    }
    else
    {
        zaklad = danovyZaklad;
        danovyZaklad = 0;
    }

    return zaklad * procenta;
}
 
Nahoru Odpovědět
12.11.2013 16:39
Avatar
coells
Neregistrovaný
Avatar
coells:12.11.2013 16:42

... a v te druhe metode je maly preklep:
danovyZaklad -= danovyZaklad - danovaMez;
nahradit
danovyZaklad -= danovaMez;

 
Nahoru Odpovědět
12.11.2013 16:42
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.