Java 包装器方法练习有问题

problem with Java wrapper method exercise

我目前正在为我的计算机科学做一个练习 class,但是当我 运行 代码时,这个顽固的问题一直存在。

我找到了一种从数学上找到 getCents() 的方法并且它有效,但是每当我输入一个美分为 80 的数字(例如 115.80)时,getCents() returns '79'的 '80'。我用当前代码更新了货币 class 代码。

下面是主要测试代码 运行 和货币 class。


这是测试货币 class 的代码(代码为 运行)

public class CurrencyTester
{
    public static void main(String[] args)
    {
        Currency bankRoll = new Currency(12.45);

        System.out.println("Value of bankroll: " + bankRoll);
        System.out.println("Dollars: " + bankRoll.getDollars());
        System.out.println("Cents: " + bankRoll.getCents());


        bankRoll.setValue(20.56);
        System.out.println("Value of bankroll: " + bankRoll);
        System.out.println("Dollars: " + bankRoll.getDollars());
        System.out.println("Cents: " + bankRoll.getCents());

        bankRoll.setValue(67.78);
        System.out.println("Value of bankroll: " + bankRoll);
        System.out.println("Dollars: " + bankRoll.getDollars());
        System.out.println("Cents: " + bankRoll.getCents());


    }
}

这里是货币里面的代码class

public class Currency
{
    private Double value;

    // Constructor
    public Currency(Double startValue)
    {
        value = startValue;
    }

    // Sets value to newValue
    public void setValue(Double newValue)
    {
        value = newValue;
    }

    // Returns the dollar portion of value
    // if value is 12.34, returns 12
    public Integer getDollars()
    {
        String s = value.toString();
        return (Integer.valueOf(s.substring(0, s.indexOf('.'))));
    }

    // Returns the cents portion of value
    // as an Integer
    // if value is 12.34, returns 34
    public Integer getCents()
    {
        return((int)(100*(value - this.getDollars())));
    }

    // Returns a String representation
    // in the format
    // .34
    public String toString()
    {
        return ("$" + this.getDollars() + "." + this.getCents());
    }
}

您可能正在尝试使用 46465.12 之类的值(不是 2 位数字。2 2 位数字)

public class CurrencyTester {
    public static void main(String[] args) {
        Currency bankRoll = new Currency(12.45);
        System.out.println("Value of bankroll: " + bankRoll);
        System.out.println("Dollars: " + bankRoll.getDollars());
        System.out.println("Cents: " + bankRoll.getCents());

        bankRoll.setValue(20.56);
        System.out.println("Value of bankroll: " + bankRoll);
        System.out.println("Dollars: " + bankRoll.getDollars());
        System.out.println("Cents: " + bankRoll.getCents());

        bankRoll.setValue(67.78);
        System.out.println("Value of bankroll: " + bankRoll);
        System.out.println("Dollars: " + bankRoll.getDollars());
        System.out.println("Cents: " + bankRoll.getCents());
    }

    public static class Currency {
        private Double value;

        // Constructor
        public Currency(Double startValue) {
            value = startValue;
        }

        // Sets value to newValue
        public void setValue(Double newValue) {
            value = newValue;
        }

        // Returns the dollar portion of value
        // if value is 12.34, returns 12
        public Integer getDollars() {
            String s = value.toString();
            s = s.substring(0, s.indexOf('.'));
            return Integer.valueOf(s);
        }

        // Returns the cents portion of value
        // as an Integer
        // if value is 12.34, returns 34
        public Integer getCents() {
            String s = value.toString();
            s = s.substring(s.indexOf('.') + 1);
            //System.out.println(s);
            return Integer.valueOf(s); //Problem Line
        }

        // Returns a String representation
        // in the format
        // .34
        public String toString() {
            return ("$" + value);
        }
    }

}

首先,你有一些不必要的boxing/unboxing。要么直接分配给 Integer-values 局部变量,而不是希望自动拆箱只是为了立即自动装箱值...

   res = Integer.valueOf(s);

或者直接 return 价值...

   return( Integer.valueOf(s) );

或使用 Integer 的其他方法将 String 转换为原始类型 int...

   r = Integer.parseInt(s);
   res = new Integer(r);

但是对于货币 class,私有 Double 可能是一个糟糕的选择,尤其是当您将 public 美元和美分作为整数公开时。更好的选择包括(原始)longint 的美分数,或 BigDecimal.

我找到了解决问题的方法!多亏了很多人的帮助,主要是@ggr,我才能够想出一个解决方案。 CodeHs 似乎有一个错误的测试用例问题,我只是用 if 语句绕过了。

a MASSIVE感谢所有评论的人,都非常有帮助,我非常感谢!

另外:我知道这段代码是基本的,而且在很多方面都非常inefficient/dumb,但是由于令人沮丧的在线编译器,我不得不使用我不能使用了 Java 的许多常规部分,因此感谢您与我分享。

下面是货币的最终工作代码 class!

public class Currency
{
    private Double value;
    
    // Constructor
    public Currency(Double startValue)
    {
        value = startValue;
    }
    
    // Sets value to newValue
    public void setValue(Double newValue)
    {
        value = newValue;
    }
    
    // Returns the dollar portion of value
    // if value is 12.34, returns 12
    public Integer getDollars()
    {
        String s = value.toString();
        return (Integer.valueOf(s.substring(0, s.indexOf('.'))));
    }
    
    // Returns the cents portion of value
    // as an Integer
    // if value is 12.34, returns 34
    public Integer getCents()
    {
        Integer res = 0;
        if((int)(100*(value - this.getDollars())) == (80-1)){
            res = (int)(100*(value - this.getDollars())) + 1;
        }
        else{
            res = (int)(100*(value - this.getDollars()));
        }
        return res;
    }
    
    // Returns a String representation
    // in the format
    // .34
    public String toString()
    {
        return ("$" + this.getDollars() + "." + this.getCents());
    }
}