2013-04-24 68 views
2

我的程序的目的是显示员工(经理的编码)的工资,具体取决于该员工在一个月内工作了多少小时。该数组包含3个员工以会计师为参数。每位员工的会计回报。编码器和管理者的工资以不同的方式计算。乘以一个双值与两个短裤的分配结果

这里是我的Java代码:

public class OOP 
    { 
     public static void main(String[] args) 
     { 
    // fill the staff array with three Employee objects. 


    Employee[] staff = new Employee[3]; 

    staff[0] = new Manager("Carl Cracker",75000.00,(short)160); 
    staff[1] = new Coder("Harry Hacker", 50000.00,(short)165); 
    staff[2] = new Coder("Tony Tester", 40000.00,(short)200); 

    Accountant Counter = new Accountant(); 
    Counter.printSalary(staff, (byte)2); 

     } 
    } 

    abstract class Employee 
    { 
     public Employee(String n, double w, short h) 
    { 
     name = n; 

     wageRate = w; 

     workedHours = h; 

    } 

    public String getName() 
    { 
     return name; 
    } 

    public double getSalary(short workingHours) 
    { 

     this.salary = this.wageRate * (this.workedHours/workingHours); 
     return salary; 
    } 

    private String name; 
    protected double wageRate; 
    protected short workedHours; 
    protected double salary; 
    } 
    class Coder extends Employee 
    { 
     public Coder (String n, double w, short h) 
     { 
      super(n, w, h); 
     } 

     public double getSalary(short workingHours) 
     { 
      return super.getSalary(workingHours); 
     } 
    } 
    class Manager extends Employee 
    { 
     public Manager (String n, double w, short h) 
     { 
      super(n, w, h); 
     } 
     public double getSalary(short workingHours) 
     { 
      if (workingHours > workedHours) 
      return super.getSalary(workingHours)*0.7; 
      else 
       { 
        salary = wageRate; 
        return salary; 
       } 


     } 
    } 
    class Accountant 
    { 
     public Accountant() 
     { 
     } 
     public void printSalary(Employee[] emp, byte monthInd) 
     { 
      Employee[] workers = emp; 
      byte MID = monthInd; 
      MID = (byte) (MID - 1); 
      for (Employee worker : workers) 
       { 
        System.out.printf("%s's salary this month is %8.2f",worker.getName(), worker.getSalary(workingHours[MID])); 
        System.out.println(); 
       } 
     } 

     private short[] workingHours = new short[]{168,160,160,172,162,154,184,168,168,184,168,172}; 
    } 

预期结果:

卡尔饼干的这个月的工资是75000

哈利黑客这个月的工资为51562.5

托尼计的薪水此月是50000

实际值r esult:

卡尔饼干的这个月的工资是75000,00

哈利黑客这个月的工资是50000,00

托尼Tester的这个月的工资是40000,00

请能有人给我解释一下为什么?

+2

只是一个值得注意的问题,你应该非常小心使用浮点数来表示货币的,看到接受回答http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency为什么 – 2013-04-24 22:17:16

+0

@AngeloGenovese我想一个更简洁的警告是你d不要先把它们四舍五入来显示它们...... – 2013-04-24 22:38:31

+1

@JuanMendes错误可以叠加,有足够多的变化可以在某些地方丢失一分钱。就我个人而言,我更喜欢使用BigDecimal或一个整数类型来保存最小的重要值(例如美分),但这是一个意见问题,这就是为什么我将这个问题与涉及一系列解决方案的争论联系起来。 – 2013-04-24 23:59:49

回答

4

你是Java中整数除法的受害者。

即使使用short值,integer division(JLS 15.17.2)也适用,其中非整数结果被截断。第二个月,索引1是160个工作小时。托尼测试员有200个小时。在正常的数学,160分之200= 1.25,但在Java整数除法,一百六十零分之二百= 1。这就是为什么你看到40000,而不是50000

在员工getSalary方法中,将值中的一个作为double得到浮点除法,这样的结果就是你想要的。

this.salary = this.wageRate * ((double) this.workedHours/workingHours); 

你的代码的输出:

$ java OOP 
Carl Cracker's salary this month is 75000.00 
Harry Hacker's salary this month is 50000.00 
Tony Tester's salary this month is 40000.00 

更改代码的输出:

$ java OOP 
Carl Cracker's salary this month is 75000.00 
Harry Hacker's salary this month is 51562.50 
Tony Tester's salary this month is 50000.00 
+2

这是一个正确的,写得很好的答案,值得赞扬,特别是当您考虑由原始海报给出的小的努力来隔离问题和发布最低必要的代码。谁低估了它应该解释他们是如何证明它被标记为“没用的”。“ – erickson 2013-04-24 22:15:35

+0

@erickson我真的认为你不应该能够在没有理由的情况下倒下,但是meta的用户并不认为它是可行的,截至目前这只是普遍的礼貌 – 2013-04-24 22:36:59