Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
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
}
}Offline
↑ vasek.t:
C nebo v čem to je neznám, ale řekl bych, (jestli jsem dobře pochopil ta pásma,tj. 0<p1<=12*20000, 12*20000<p2<=12*40000, p3>12*40000) že za tím prvním else máš špatně else if (prijemZaRok>12*20000 || prijemZaRok<=40000), mělo by být
else if ( prijemZaRok<=12*40000)
a u druhého else už tu podmínku else if (prijemZaRok>12*40000) nemusíš opakovat, ale stačí
else {
mzdaDo20000 = 20000 -(((danZaklad1/100)*15)/12);
.
.
Tedy
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*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 {
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
}
}Offline
↑ vasek.t:
Já jsem nekontroloval to jak to máš vypočítané, ale pouze ty podmínky.
Napiš prosím tě jek se ta daň počítá.
Mně se zdá, že ti v tom dělá zmatek ta krev.
Já osobně bych nejdříve spočítal: danZakl = prijemZaRok-krev*4000;
Tu podmínku if (danZaklad < 0) danZaklad = 0; tam můžeš nechat
Pak bych posuzoval danZaklad
double prijemZaRok = 12*prijem;
double danZaklad = prijemZaRok-krev*4000;
if (danZaklad < 0)
danZaklad = 0;
if (danZaklad<=240000)
{danZaklad1 = danZaklad;
danZakladNad20 = 0;
danZakladNad40 = 0;
}
else
if (danZaklad<=480000)
{danZaklad1 = 240000;
danZakladNad20 = danZaklad-240000;
danZakladNad40 = 0;
}
else
{danZaklad1 = 240000;
danZakladNad20 = 240000;
danZakladNad40 = danZaklad-480000;
}
double vypoctenaDan = (danZaklad1*15+danZakladNad20*25+danZakladNad40*35)/100;
double mzdaCelk = prijem - vypoctenaDan/12;
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) mzdaCelk );Offline
tady je zadání 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
↑ Honzc:
máš pravdu, že tam dělá bordel ta krev tohle teď mám tak zkusím ty tvoje úpravy
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 );
}
}
}
}Offline
když jsem vzal tvůj kód tak to pořád háže špatné výsledky, u všech tří částí to dává dobré výsledky když nezadávím krev, u části do 20000 příjmu to jde i s krví a začne to blbnout když zadám 29000 plat a 5xdarování krve ↑ vasek.t:
double prijemZaRok = 12*prijem;
double danZaklad = prijemZaRok-krev*4000;
double danZaklad1;
double danZakladNad20;
double danZakladNad40;
if (danZaklad < 0)
danZaklad = 0;
if (danZaklad<=240000)
{danZaklad1 = danZaklad;
danZakladNad20 = 0;
danZakladNad40 = 0;
}
else
if (danZaklad<=480000)
{danZaklad1 = 240000;
danZakladNad20 = danZaklad-240000;
danZakladNad40 = 0;
}
else
{danZaklad1 = 240000;
danZakladNad20 = 240000;
danZakladNad40 = danZaklad-480000;
}
double vypoctenaDan = (danZaklad1*15+danZakladNad20*25+danZakladNad40*35)/100;
double mzdaCelk = prijem - vypoctenaDan/12;
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) mzdaCelk );
// TODO code application logic here
}
}Offline
↑ vasek.t:
Podle čeho usuzuješ, že je nějaký výsledek špatně nebo dobře?
(Máš k tomu nějaké tabulky nebo něco jiného)
Nevím proč by to mělo házet špatné výsledky pro prijem 29000 a 5xkrev.
Projdeme si jak to řeší program, který jsem ti napsal.
Tedy máme: prijem=29000 krev=5
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í
pro nás danZaklad = 12*29000-5*4000 (=328000)
o z částky do (12 * 20 000) je sazba 15 %, (12*20000=240000)
o z částky do (12 * 40 000) je sazba 25 %, (12*40000=480000)
o z částky nad (12 * 40 000) je sazba 35 % (>480000)
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(=24000) a ze zbývajících 12 * 20 000 (=240000) se platí jen 15 %
Jdeme po rozhodování
danZaklad =328000 ten je větší než než 240000 ale menší než 480000.
jsme tedy v této větvi:
else
if (danZaklad<=480000)
{danZaklad1 = 240000;
danZakladNad20 = danZaklad-240000;
danZakladNad40 = 0;
}
a máme:
danZaklad1 = 240000
danZakladNad20 = 328000-240000 = 88000
danZakladNad40 = 0
vypoctenaDan = (danZaklad1*15+danZakladNad20*25+danZakladNad40*35)/100=
(240000*15+88000*25+0*35)/100=58000
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
mzdaCelk = prijem - vypoctenaDan/12=29000-58000/12=24166.67
Jsem přesvědčen, že program počítá přesně tak, jak jsou zadány podmínky výpočtu.
Offline