Diskuze: špatné výstupy
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
O jakou daň se jedná a podle jaké legislativy ji počítáš?
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
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.
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);
}
}
}
}
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;
}
Zobrazeno 8 zpráv z 8.