Avatar
vasatom
Člen
Avatar
vasatom:

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
Redaktor
Avatar
Odpovídá na vasatom
Silvinios:

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:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na vasatom
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
goddard
Člen
Avatar
goddard:

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:

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:

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:

... 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.