2013-04-14 6 views
0

이 h.getNetYearlyIncome()에서 실패하고 5k가 너무 높습니다. 나는 하루 종일 그것에 종사하고 있고 그것을 이해할 수 없다.메서드를 호출하고 로컬 변수를 반환하는 데 차이점은 무엇입니까?

public void testSalariedEmployeeMakingOver100K() { 
SalariedEmployee h = new SalariedEmployeeImpl("John", "Doe", "Mechanical Turk", 1111, 9166.75); 

    assertEquals(h.getFirstName(), "John"); 
    assertEquals(h.getLastName(), "Doe"); 
    assertEquals(h.getJobTitle(), "Mechanical Turk"); 
    assertEquals(h.getID(), 1111); 
    assertEquals(h.getMonthlySalary(), 9166.75, 0.005); 
    assertEquals(h.getGrossYearlyIncome(), 9166.75*12, 0.005); 
    assertEquals(h.getTaxableIncome(), h.getGrossYearlyIncome(), 0.005); 
    assertEquals(h.getTaxesWithheld(), 15000.25, 0.005); 
    assertEquals(h.getNetYearlyIncome(), h.getGrossYearlyIncome()-h.getTaxesWithheld(), 0.005); 
} 




public class SalariedEmployeeImpl extends EmployeeImpl implements 
    SalariedEmployee { 
String first_name; 
String last_name; 
String job_title; 
int id; 
double monthly_salary = 0.0; 
double yearlyIncome = 0.0; 
double taxableIncome = 0.0; 
double netIncome = 0.0; 
double taxesWitheld = 0.0; 
double over100k = 0.0; 
double over50k= 0.0; 

SalariedEmployeeImpl(String first_name, String last_name, String job_title, 
     int id, double monthly_salary) { 
    this.first_name = first_name; 
    this.last_name = last_name; 
    this.job_title = job_title; 
    this.id = id; 
    this.monthly_salary = monthly_salary; 
} 

public String getFirstName() { 

    return first_name; 
} 

public String getLastName() { 

    return last_name; 
} 

public String getJobTitle() { 

    return job_title; 
} 

public int getID() { 

    return id; 
} 

public double getGrossYearlyIncome() { 

    yearlyIncome = (monthly_salary * 12); 

    return yearlyIncome; 
} 



public double getTaxableIncome() { 

    taxableIncome = (monthly_salary*12); 
    return taxableIncome; 
} 


    public double getTaxesWithheld() { 

    double over100k = 0.0; 
double over50k= 0.0; 

    if(taxableIncome>100000.0){ 
     over100k = taxableIncome -100000.0; 
     taxableIncome -=over100k; 

    } 
    if(taxableIncome >50000.0 && taxableIncome <=100000.0){ 
     over50k = taxableIncome-50000.0; 
     taxableIncome -=over50k; 


    } 



     taxesWitheld = taxesWitheld + (.15 * over50k)+(.25 * over100k)+(.1*taxableIncome); 

     return taxesWitheld ; 
} 
public double getNetYearlyIncome() { 

    return yearlyIncome-taxesWitheld; 
} 
public double getMonthlySalary() { 

    return monthly_salary; 
} 

public void setMonthlySalary(double salary) { 
    this.monthly_salary = salary; 

} 

}

+0

@ BheshGurung이 말하는 것은 사실입니다. 통화를 나타 내기 위해'double '을 사용하면, 어느 시점에서 정밀도를 잃거나 반올림하여 물릴 것입니다. 그러나 그것은 당신의 문제를 일으키는 것이 아닙니다. – sigpwned

답변

4

함수 getGrossYearlyIncome 그냥 게터 아니다 h.getTaxesWithheld() yearlyIncome-taxesWitheld에 동일하지 -

왜 h.getNetYearlyIncome() = h.getGrossYearlyIncome()이다 함수 —은 yearlyIncome을 초기화합니다. 이 함수를 호출 할 때까지 yearlyIncome의 값은 0입니다. 그러나 getNetYearlyIncomeyearlyIncome을 사용하지만 getGrossYearlyIncome은 호출하지 않으므로 yearlyIncome이 먼저 호출 될 때 제대로 초기화되지 않습니다.

getTaxableIncomegetTaxesWithheld —과 비슷한 문제가 발생합니다. 값을 가져올뿐만 아니라 호출시 멤버 필드를 초기화합니다.

+0

그는'assertEquals' 전에'getGrossYearlyIncome'과'getTaxesWithheld'를 호출합니다. 문제는 그가'taxesWithheld'를 사용하여'taxesWithheld'을 설정한다는 것입니다. 그래서 함수를 두 번 호출 할 때 다른 값을 생성합니다. 즉, getTaxesWithheld는 멱등수가 아닙니다. – rliu

+0

정확히 올바른 수정은 무엇입니까? – Fish

+0

'getTaxesWithheld' 함수를 이해하지 못했지만, (기술적으로, 필자는이 코드를 다시 작성하는 것을 강력하게 고려할 것입니다.) 설정을하면 할당의 오른쪽에서'taxesWithheld'가 제거됩니다. 거기에. 왜 처음에는 정확히 그곳에 있습니까? – rliu