我已经在这个问题上工作了几天了,但仍然无法解决。如果有人可以帮助,那就太好了。

问题就解决了...
编写一个程序,计算单个申报者的所得税负担。

TAX RATE   Single Filers Income
10%        Up to $6000
15%        $6,001 - $27,950
27%        $27,951 - $67,700
30%        $67,701 - $141,250
35%        $141,251 - $307,050
38.6%      $307, 051 or more



用户应该能够使用新的Scanner(System.in)输入方法输入其收入,然后退还所欠税款。
解决问题和处理用户输入的所有源代码都应在“程序员创建的类”中创建。
使用return可以从计算或if / else语句等中检索所有值。
main将用于操作程序。
输出的美元格式应正确,小数点后两位。


示例输出(输出应具有正确的美元格式,小数点后两位)


  收入$ 85000.00的单人所得税为$ 25500.00
  
  单身人士年收入$ 9800.00的所得税是$ 1470.00


我在这里收到很多错误消息,我确定我要修复很多。非常感谢所有帮助。谢谢你们。

这是我到目前为止所拥有的。不知道我是否朝着正确的方向前进。

package taxscan12;
import java.util.Scanner;

class tax{
    double income, taxrate, math;

    Scanner scan = new Scanner(System.in);

    tax tax1 = new tax();

    double tax1(){
        tax1.income = scan.nextDouble();
        if(income <= 6000){
            taxrate = .10;
            System.out.printf(" tax burden is $%.2f ");
            return math = income * taxrate;
        }

        if(income >= 6001 && income <= 27950 ){
            taxrate = .15;
            System.out.printf(" tax burden is $%.2f ");
            return math = income * taxrate;
        }

        if(income >= 27951 && income <= 67700){
            taxrate = .27;
            System.out.printf(" tax burden is $%.2f ");
            return math = income * taxrate;
        }

        if(income >= 67701 && income <= 141250){
            taxrate = .30;
            System.out.printf(" tax burden is $%.2f ");
            return math = income * taxrate;
        }

        if(income >= 141251 && income <= 307050){
            taxrate = .35;
            System.out.printf(" tax burden is $%.2f ");
            return math = income * taxrate;
        }

        if(income >= 307051){
            taxrate = .386;
            System.out.printf(" tax burden is $%.2f ");
            return math = income * taxrate;
        }
        return 0;
    }
}

public class Taxscan12 {
    public static void main(String[] args) {
        double taxes;
        tax taxx = new tax();
        taxes = taxx.tax1();
    }
}

最佳答案

我已经将您的程序加载到了IntelliJ窗口中,并且逐步地研究了可以修复/改进程序的方法。我将尝试涵盖很多内容,并且将包括一些可能是可选的内容,即,您无需为了使程序正常工作而必须做的事情。

声明字段时请小心

在您的tax类中,声明字段tax tax1 = new tax();。这将使您的程序具有所谓的StackOverflowError。如果您是计算机科学专业的人,将会学到更多有关其真正含义的信息,但这实际上意味着您的代码将永远运行并导致“堆栈”用尽内存。为什么会这样呢?每次通过调用tax创建new tax()类的新实例时,您的代码都会通过在表示tax的行中调用new tax()来尝试创建tax tax1 = new tax();的新实例。每次尝试创建tax时,都会因为尝试创建另一个tax而卡住,并最终永久执行此操作。幸运的是,您的tax类不需要此tax tax1 = new tax()行,因此我们可以通过简单地从您的tax tax1 = new tax()类中删除行tax来解决此问题。

注意引用实例的字段,而不要引用其他实例的字段

在方法double tax1()中,您引用的是先前创建的tax tax1字段中的字段。幸运的是,您不必这样做。在tax类的内部,您可以引用通过名称创建的所有字段,例如在tax里面,您可以简单地说income = scan.nextDouble();

在扫描用户输入之前打印提示

当您在命令行中扫描用户输入时(例如在代码中),在扫描之前将提示打印到命令行始终是一个好主意。这样,用户知道他们应该输入一些内容,而不是仅仅认为编程会花费很长时间才能执行/不执行任何操作。

您可以考虑将double tax1()方法的第一部分调整为如下所示:

System.out.println("Enter your income: ");
income = scan.nextDouble();


...而不只是income = scan.nextDouble();。这样,用户将知道他们需要输入收入。

避免在一堂课中做太多事情

在您的tax类中,您尝试计算税额并在同一步骤中将其打印到屏幕上。相反,您应该仅将double tax1()方法用于计算收入,并在Taxscan12类的public static void main(String[] args)方法中打印结果。这样,更容易分辨tax1()方法的计算情况,以后更容易更改。

您应该从System.out.printf(" tax burden is $%.2f ");类的double tax1()方法中删除所有tax行,并调整public static void main(String[] args)类中的Taxscan12方法,使其看起来像这样:

public static void main(String[] args) {
    double taxes;
    Tax taxx = new Tax();
    taxes = taxx.tax1();
    System.out.printf("Your tax burden is $%.2f \n", taxes);
}


*注意:*我在taxes调用中添加了System.out.printf()作为参数,以便系统知道要打印哪些内容作为其税收负担。 %.2f告诉调用该位置的电话,但是如果您不给它一个号码,它将无法打印您告诉它的打印内容,因此会引发异常。

如果您一直沿用至今,那么您的程序现在应该可以正常工作了。接下来的建议是使程序更整洁的一个好主意,如果您的作业是部分根据干净的代码或遵循约定进行分级,则这是一个特别好主意

遵循Java命名约定

税种的名称为tax,小写。这意味着要声明tax的实例,您必须执行tax taxx = new tax();'taxx'这样的名称不是很好的名字,但是我知道您为什么这样做。由于您将类命名为tax,因此现在无法命名可变税,因此在末尾添加了x。相反,所有类名都以大写字母开头,即使用class Tax代替class tax。这样,您就可以声明Tax tax = new Tax();这样的变量,这有助于避免混淆名称。

选择描述性方法名称

根据您的方法命名方法是一个好主意。在您的tax类中,您的double tax1()方法计算用户的税负,因此最好将其名称更改为double calculateTaxBurden()

避免多余的变量

您在math方法和double tax1()类中的tax变量没有任何作用,因为一旦分配了变量,便会立即返回它的值。您应该删除math变量,只说return income * taxrate;。这将使您对代码中发生的事情更加清楚,因为您不会混淆变量,这些变量不会做任何事情。

尝试减少代码重复

您的每个if语句共享同一行代码:return math = income * taxrate;。这不会使您的代码无法正常工作,但是如果您可以将该行移出if语句,那将会很好。为什么要避免代码重复是一个更好的主意的例子是何时需要进行更改。现在让我们说,每个人都从他们的收入中扣除了2000美元,并获得了200美元的税收抵免。当前,您必须更改6行代码才能实现这些新规则。相反,您应该将共享代码从这些if语句中移出,以便仅在一个位置进行税金计算的更改。换一种说法:

    taxrate = 0;
    income = scan.nextDouble();
    if(income <= 6000){
        taxrate = .10;
    }

    if(income >= 6001 && income <= 27950 ){
        taxrate = .15;
    }

    if(income >= 27951 && income <= 67700){
        taxrate = .27;
    }

    if(income >= 67701 && income <= 141250){
        taxrate = .30;
    }

    if(income >= 141251 && income <= 307050){
        taxrate = .35;
    }

    if(income >= 307051){
        taxrate = .386;
    }
    return income * taxrate;


现在看来似乎并不重要,但是保持代码整洁,简单和易于维护是早日习惯的好习惯。当您开始从事越来越大的项目时,它将为您节省很多精力。

关于java - 家庭作业方法回国协助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29268068/

10-11 19:19