因此,我必须使用方法来做一个改变者,而不能。
实验室说

使用最少数量的硬币。 $ 1.39美元也等于0个季度,0个角钱,0个镍币和139个便士,但是如果您以这种方式进行找零,您将不会有一个非常成功的出纳职业。
在第二个程序中,通过使ChangeMaker类不包含任何输入到控制台或从控制台输入或输出的内容,来保持灵活性。这样,它可以在控制台应用程序,Windows应用程序或Web应用程序中使用!
另外,请注意,我包含了toString()方法,这是一个返回描述类的字符串的标准方法。
还要用$ 1.15进行测试,以确保获得正确的答案。此数字存储为1.14999999,因此需要四舍五入才能正确处理。确保在您的解决方案中进行处理。

测试员班

import java.util.Scanner;

public class Assignment1ChangeMaker {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    ChangeMaker c1 = new ChangeMaker();
    System.out.print("Please set the amount of money that you wish to convert into change: $");
    c1.setMoney(sc.nextDouble());
    c1.calculateChange();
    System.out.println(c1.toString());
    }

}


方法类别

public class ChangeMaker {
    private double money;
    private int numberOfQuarters;
    private int numberOfDimes;
    private int numberOfNickels;
    private int numberOfPennies;

public ChangeMaker(){
    money = 0.00;
    numberOfQuarters = 0;
    numberOfDimes = 0;
    numberOfNickels = 0;
    numberOfPennies = 0;
}

public double getMoney(){
    return money;
}
public void setMoney(double amount){
    this.money = (double) Math.round(amount * 100.0) / 100.0;
}
public void calculateChange(){
    numberOfQuarters = (int) Math.floor(money  / 0.25) ;
    numberOfDimes = (int) Math.floor((money - 0.25 * numberOfQuarters) / 0.10);
    numberOfNickels = (int) Math.floor((money - 0.25 * numberOfQuarters - 0.10 * numberOfDimes) / 0.05);
    numberOfPennies = (int) Math.floor((money - 0.25 * numberOfQuarters - 0.10 * numberOfDimes - 0.05 * numberOfNickels) / 0.01);
}
public String toString(){
   return "$" + money +" equals " + numberOfQuarters + " quarters, " + numberOfDimes + " dimes, " + numberOfNickels + " nickels, and " + numberOfPennies + " pennies.";
  }
}


一切都很好,但是每当您输入1.4999999时,您都会突然损失一分钱。实际上,在进行了一些测试之后,只要有四分之一,一个角钱和两个以上的便士,它总是会损失一分钱。

例如:
0.43美元等于1个季度,1个角钱,1个镍币和2个便士。
$ 1.13等于4个季度,1个角钱,0个镍币和2个便士。
1.38美元等于5个季度,1个角钱,0个镍币和2个便士。
工作的:
$ 1.09等于4个季度,0个角钱,1个镍币和4个便士。
$ 1.62等于6个季度,1个角钱,0个镍币和2个便士。
$ 1.12等于4个季度,1个角钱,0个镍币和2个便士。

任何帮助都会很棒。 :)

最佳答案

代替使用double,将钱存储为代表便士数量的整数可能是一个更好的主意。这应该允许您消除calculateChange()中的所有浮点算法,这可能是造成信息丢失的原因。

这是我的意思的示例:

private int numberOfPennies;

public void setMoney(double money) {
    numberOfPennies = (int) Math.round(money * 100);
}

public void calculateChange() {
    // subtract 25s, then 10s, then 5s, then 1s, until 0.
}

08-18 15:28