我遇到了一个让我疯狂的非常简单的问题。我正在尝试计算销售佣金并将其添加到工资中,但是当我运行代码时,它总是给我0美元的佣金和0美元的补偿。这是我到目前为止的代码:
package compensationcalculator;
import java.text.NumberFormat;
public class CompensationCalculator {
private double salary = 75000;
private double sales;
private double commission;
private double compensation;
public CompensationCalculator() {
this.salary = 75000.00;
}
public void setSales(double sales) {
this.sales = sales;
}
public double getCommission() {
this.commission = (sales * 0.2);
return commission;
}
public double getCompensation() {
this.compensation = (salary + commission);
return compensation;
}
public String toString() {
NumberFormat fmt = NumberFormat.getCurrencyInstance();
return ("Annual Salary: " + fmt.format(salary) + "\n"
+ "Total Sales: " + fmt.format(sales) + "\n"
+ "Total Commission: " + fmt.format(commission) + "\n"
+ "Total Annual Compensation: " + fmt.format(compensation));
}
}
现在当我在提示销售时输入5000时,我会在运行后得到这个答案:
Annual Salary: $75,000.00
Total Sales: $5,000.00
Total Commission: $0.00
Total Annual Compensation: $0.00
我确信这是一个简单的错误,但我在相当长的一段时间内没有使用过Java。我把它与几年前的一些旧代码进行了比较,看不出我错过了什么。非常欢迎任何指导!
答案 0 :(得分:5)
补偿值基于commission
,这是一个计算值。
您需要在设置值时预先计算所有值,或者需要使用这些方法中的值,例如......
public void setSales(double sales) {
this.sales = sales;
commission = sales * 0.2;
compensation = salary + commission;
}
public double getCommission() {
return commission;
}
public double getCompensation() {
return compensation;
}
public double getCompensation() {
this.compensation = (salary + getCommission());
return compensation;
}
public String toString() {
NumberFormat fmt = NumberFormat.getCurrencyInstance();
return ("Annual Salary: " + fmt.format(salary) + "\n"
+ "Total Sales: " + fmt.format(sales) + "\n"
+ "Total Commission: " + fmt.format(getCommission()) + "\n"
+ "Total Annual Compensation: " + fmt.format(getCompensation()));
}
答案 1 :(得分:3)
为了使方法起作用,您必须实际调用该方法。
试
return ("Annual Salary: " + fmt.format(salary) + "\n"
+ "Total Sales: " + fmt.format(sales) + "\n"
+ "Total Commission: " + fmt.format(getCommission ()) + "\n"
+ "Total Annual Compensation: " + fmt.format(getCompensation ()));
调用变量本身不会导致调用getters方法。
答案 2 :(得分:2)
您需要确保调用 getCommission
和getCompensation
,以便设置成员变量。
解决问题的最简单方法是将这些变量设置在setSales
内,以便它们始终保持一致。
或完全抛弃它们,因为它们可以按需计算。
只需让getWhatever
只返回一个计算变量,并确保toString
调用getWhatever
来“打印”该值。
答案 3 :(得分:1)
不会调用计算输出的方法。像这样更改toString()方法:
return "Annual Salary: " + fmt.format(this.salary) + "\n" + "Total Sales: " + fmt.format(this.sales) + "\n"
+ "Total Commission: " + fmt.format(getCommission()) + "\n" + "Total Annual Compensation: "
+ fmt.format(getCompensation());
答案 4 :(得分:1)
这里的问题是你的构造函数无法显式初始化几个字段,因此它们被初始化为默认值0,你永远不会调用计算它们的方法。 (设计说明:你应该在构造函数中初始化这些,在没有成员变量的情况下懒惰地计算它们,或者懒惰地计算并缓存值,但除非你缓存这个值,否则你真的不应该在你可能也不应该做一个缓存方法,除非有充分的理由这样做。保持简单,只是总是懒惰地计算结果而不保存成员中的值或总是在构造函数中初始化类似这样的东西)
然而,关于这个问题,我觉得必须指出double
和float
类型真正用于科学计算,而不是货币用途。 Double将根据二进制约定进行舍入,而对于货币,您确实希望根据十进制系统进行舍入非常严格。在Java中,您可以使用BigDecimal类进行十进制计算。
答案 5 :(得分:0)
这是你的toString,方法:
public String toString() {
NumberFormat fmt = NumberFormat.getCurrencyInstance();
return ("Annual Salary: " + fmt.format(salary) + "\n"
+ "Total Sales: " + fmt.format(sales) + "\n"
+ "Total Commission: " + fmt.format(getCommission()) + "\n"
+ "Total Annual Compensation: " + fmt.format(getCompensation()));
}
未设置佣金和补偿变量。