2014-09-08 5 views
-2

Я пытаюсь сконденсировать этот код, чтобы он стал более компактным. Я знаю, что должен быть способ использовать вычисления из выражения else else if, чтобы использовать его в следующем расчете налоговых кронштейнов. Я попытался поместить tax = ph в each else, если оператор использовать в следующем вычислении (для значения владельца места), но он просто проигнорирует его. Редактировать: переписывать это здесь, чтобы не было похоже на обратную связь. Мой код слишком длинный, как я могу сделать его короче? Также я должен использовать оператор switch в этом назначении.Как сконденсировать эту java-программу?

public static void main(String[] args) { 

    Scanner input = new Scanner(System.in); 

    System.out.print(
    "(0-single filer, 1-married jointly or qualifying widow(er), " 
    + "\n2-married separately, 3-head of household)\n" + 
    "Enter the filing status: "); 

int status = input.nextInt(); 

System.out.print("Enter the taxable income: "); 
double income = input.nextDouble(); 
double tax = 0; 



switch (status){ 
    case 0: {  // file single 
     if (income <= 8350) 
     tax = income * 0.10; 
     else if (income <= 33950) 
     tax = 8350 * 0.10 + (income - 8350) * 0.15; 
     else if (income <= 82250) 
     tax = 8350 * 0.10 + (33950 - 8350) * 0.15 + 
     (income - 33950) * 0.25; 
     else if (income <= 171550) 
     tax = 8350 * 0.10 + (33950 - 8350) * 0.15 + 
     (82250 - 33950) * 0.25 + (income - 82250) * 0.28; 
     else if (income <= 372950) 
     tax = 8350 * 0.10 + (33950 - 8350) * 0.15 + 
     (82250 - 33950) * 0.25 + (171550 - 82250) * 0.28 + 
     (income - 171550) * 0.33; 
     else 
     tax = 8350 * 0.10 + (33950 - 8350) * 0.15 + 
     (82250 - 33950) * 0.25 + (171550 - 82250) * 0.28 + 
     (372950 - 171550) * 0.33 + (income - 372950) * 0.35; 
      } 
    break; 
    case 1:{  //file married or Widow 
     if (income <= 16700) 
      tax = income * 0.10; 
     else if(income <= 67900) 
      tax = 16700 * .10 + (income - 16700) * .15; 
     else if (income <= 137050) 
      tax = 16700 * .10 + (67900 - 16700) * .15 + (income - 137050) * .25; 
     else if (income <= 208850) 
      tax = 16700 * .10 + (67900 - 16700) * .15 + (137050 - 67900) * .25 + 
        (income - 208850) * .28; 
     else if (income <= 372950) 
      tax = 16700 * .10 + (67900 - 16700) * .15 + (137050 - 67900) * .25 + 
        (208850 - 137050) * .28 + (income - 372950) * .33; 
     else 
      tax = 16700 * .10 + (67900 - 16700) * .15 + (137050 - 67900) * .25 + 
        (208850 - 137050) * .28 + (372950 - 208850) * .33 + (income - 372950) * .35; 
    } 
    break; 

} 
System.out.println("Your tax will be $" + tax); 


} 

}

+0

Можете ли вы не учитывать все жестко закодированные вычисления в числа. Измените это «8350 * 0.10 + (33950 - 8350) * 0,15 + (82250 - 33950) * 0,25 + (171550 - 82250) * 0,28 + (372950 - 171550) * 0,33" на любой результат. Это значительно облегчит читаемость. – tom

+1

@tom, с другой стороны, это будет плохо для ремонтопригодности, потому что он скрывает формулу, лежащую за значениями. – Henry

+0

то хотя бы сделать их константами! – tom

ответ

0

Эта версия имеет минимальную проверку условий за счет дополнительных вычислений, создавая довольно сжатый код и все «магические» номера легко видны в одном месте.

public static void main(String[] args) { 
    int income = 1000000; // Sample test amount of income, should result in 327,683.50 in taxes. 
    double tax = 0; 
    if (income > 0) { 
     tax = income * 0.10; 
     tax += (Math.max(0, income-8350)) * 0.05; 
     tax += (Math.max(0, income-33950)) * 0.10; 
     tax += (Math.max(0, income-82250)) * 0.03; 
     tax += (Math.max(0, income-171550)) * 0.05; 
     tax += (Math.max(0, income-372950)) * 0.02; 
    } 
    System.out.println("Tax: " + tax); 
} 
+0

Спасибо! Это очень баребоны, я точно не знаю, что делает «Math.max», но я буду смотреть, потому что это спасает меня sooooo много времени! –

+0

Math.max выбирает наибольшее число из переданных параметров. Math.max (0, -7) будет оцениваться до 0. Это используется для обеспечения того, чтобы вы не вычисляли, а затем наносили отрицательную сумму. –

1

Просто предложение, но вы можете постепенно увеличить "налог" и "уменьшить доходы".

Например:

tax = income * 0.10; // 10% you always pay 
income = Math.max(0, income-8350); // Take away the first 8350, on which we already have 10% tas 
tax += income * 0.05; // 5% more on income higher than 8350 
income = Math.max(0, income-33950); // Take away 33950, on wich we already gave 5% more taxes 
tax += income * 0.10; // 10% more on income higher than 33950 

И так далее.

Двойная проверка моей математики, я не исследовал все ваши ifs, но я использовал этот способ для расчета налогов здесь.

Не стесняйтесь спрашивать пояснения.

0

Что вы могли бы сделать (просто показывает часть случая 0):

tax = income * 0.10; 
income -= 8350; 
if (income > 0) { 
    tax += income * (0.15 - 0.1); 
    income -= 33950 - 8350; 
} 
if (income > 0) { 
    tax += income * (0.25 - 0.15); 
    income -= 82250 - 33950; 
} 
... 

Это также показывает, как можно использовать цикл, чтобы сделать расчеты при сохранении постоянных в двух массивах.

Смежные вопросы