因此,我必须使用方法来做一个改变者,而不能。
实验室说
使用最少数量的硬币。 $ 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.
}