我几天来一直在研究这个问题,但我仍然无法弄明白。如果有人能提供帮助,那就太棒了。
问题出在了......
编写一个程序来计算单个文件管理者的所得税负担。
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
示例输出(输出应具有适当的美元格式,2位小数)
单个人的所得税$ 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();
}
}
答案 0 :(得分:4)
我已将您的程序加载到我的IntelliJ窗口中,并且我已逐步查看您可以修复/改进程序的方法。我将尝试覆盖很多内容,并且我将包含一些可能可选的内容,即您不需要做的事情你的程序可以工作,但可能应该这样做。
声明字段时要小心
在tax
课程中,您声明字段tax tax1 = new tax();
这会导致您的程序拥有所谓的StackOverflowError
。如果你从事计算机科学,你将会更多地了解这实际意味着什么,但它实质上意味着你的代码永远在运行,并导致“堆栈”。耗尽内存。为什么会这样?每次通过调用tax
创建new tax()
课程的新实例时,您的代码都会尝试通过在tax
的行中调用new tax()
来创建tax tax1 = new tax();
的新实例{1}}。每当它尝试创建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();
&#39; taxx&#39;不是一个非常好的名字,但我明白你为什么这么做。因为您为自己的班级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语句,那将会很好。为什么避免代码重复是一个更好的想法的一个例子是什么时候改变事情。现在让我们说每个人从他们的收入和200美元的税收抵免中获得2000美元的扣除额。目前,您必须更改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;
现在看起来似乎并不重要,但保持代码干净,简单易维护是一个很好的习惯。当您开始处理越来越大的项目时,它将为您节省大量精力。