【问题标题】:Why am I getting an error message while trying to code for change?为什么我在尝试更改代码时收到错误消息?
【发布时间】:2021-02-15 22:04:12
【问题描述】:

这是一个问题:店员需要一个程序来计算准确的零钱,以便为顾客提供最少数量的纸币和硬币。您应输入购买金额和支付的金额(交给店员),然后输出所需的找零和每张钞票和硬币的数量以弥补找零。请记住,您希望每种情况下的硬币和纸币数量最少。

** 在编写任何代码之前先计划好这个程序 **

程序的示例运行如下所示。

Change Making Program
Please enter the total purchase: $1.42
Please enter the amount tendered: $20.00
The change will be: $18.58
To make up this amount you will need:
1 ten-dollar bill
1 five-dollar bill
1 two-dollar coin
1 loonie
2 quarters
1 nickel
3 pennies
Thank you for using the Change Making Program

这是我目前所拥有的:

package defaultpackage;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class ChangeMaker {

    public static void main(String[] args) throws IOException {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.print("Please enter the total of your purchase: $");
        double total = Integer.parseInt(stdin.readLine());
        
        System.out.print("Please enter the amount of money tendered: $");
        double tendered = Integer.parseInt(stdin.readLine());
        
        double change = tendered - total;
        
        System.out.print("Your change is: $" +change);
    
        if (change > 99.99)
        {
            double hundreds = (change - (change % 100)) / 100;
            System.out.print("Hundred-dollar bills: " + hundreds);
            change = change - (hundreds * 100);
        }
        if (change > 49.99)
        {
            double fifties = (change - (change % 50)) / 50;
            System.out.print("Fifty-dollar bills: " + fifties);
            change = change - (fifties * 50);
        }
        if (change > 19.99)
        {
            double twenties = (change - (change % 20)) / 20;
            System.out.print("Twenty-dollar bills: " + twenties);
            change = change - (twenties * 20);
        }
        if (change > 9.99)
        {
            double tens = (change - (change % 10)) / 10;
            System.out.print("Ten-dollar bills: " + tens);
            change = change - (tens * 10);
        }
        if (change > 4.99)
        {
            double fives = (change - (change % 5)) / 5;
            System.out.print("Five-dollar bills: " + fives);
            change = change - (fives * 5);
        }
        if (change > 1.99)
        {
            double toonies = (change - (change % 2)) / 2;
            System.out.print("Toonies: " + toonies);
            change = change - (toonies * 2);
        }
        if (change > 0.99)
        {
            double loonies = (change - (change % 1)) / 1;
            System.out.print("Loonies: " + loonies);
            change = change - (loonies * 1);
        }
        if (change > 0.24)
        {
            double quarters = (change - (change % 0.25)) / 0.25;
            System.out.print("Quarters: " + quarters);
            change = change - (quarters * 0.25);
        }
        if (change > 0.09)
        {
            double dimes = (change - (change % 0.1)) / 0.1;
            System.out.print("Dimes: " + dimes);
            change = change - (dimes * 0.1);
        }
        if (change > 0.04)
        {
            double nickles = (change - (change % 0.05)) / 0.05;
            System.out.print("Nickles: " + nickles);
            change = change - (nickles * 0.05);
        }
        if (change > 0)
        {
            double pennies = (change - (change % 0.1)) / 0.1;
            System.out.print("Pennies : " + pennies);
            change = change - (pennies * 0.1);
        }
    }
}

【问题讨论】:

  • 错误信息是什么?
  • 请编辑问题并显示完整的堆栈跟踪(如果有)
  • 注意:Integer.parseInt 只能解析整数(整数)。如果您希望能够输入美元和便士,则需要使用例如Double.parseDouble.
  • 请输入您的购买总额:14.29 美元线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:java.base/java.lang.NumberFormatException.forInputString(NumberFormatException) 中的“14.29” .java:68) 在 java.base/java.lang.Integer.parseInt(Integer.java:652) 在 java.base/java.lang.Integer.parseInt(Integer.java:770) 在 defaultpackage.ChangeMaker.main( ChangeMaker.java:12)
  • 您的代码需要一个整数输入,但您输入的是 14.29。

标签: java currency


【解决方案1】:

这是您提出的问题的解决方案。它会准确地产生所需的输出。

代码使用整数数学来避免在使用浮点值表示美元金额时不可避免地会遇到的精度问题。为此,输入值乘以 100 并视为美分。打印出美元金额时,我们除以 100 以表示以美元为单位的价值。

此代码的另一个特点是它是数据驱动的。与其一遍又一遍地重复删除每个面额的逻辑,一个表格提供了有关每个面额的信息,然后只有一个循环运行的代码块来处理每个面额。该代码在适当的时候处理每个面额名称的正确复数形式,包括“便士”的特殊情况。

package defaultpackage;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.List;

class Denomination {
    public Denomination(int value, String name, String pluralName) {
        this.value = value;
        this.name = name;
        this.pluralName = pluralName;
    }

    public Denomination(int value, String name) {
        this(value, name, null);
    }

    String getDescription(int count) {
        String desc = this.name;
        if (count > 1)
            if (pluralName == null)
                desc += 's';
            else
                desc = pluralName;
        return desc;
    }

    public int getValue() {
        return value;
    }

    private final int value;
    private final String name;
    private final String pluralName;
}

class ChangeMaker {

    private static final List<Denomination> denominations = List.of(
            new Denomination(10000, "one-hundred-dollar bill"),
            new Denomination(5000, "fifty-dollar bill"),
            new Denomination(2000, "twenty-dollar bill"),
            new Denomination(1000, "ten-dollar bill"),
            new Denomination(500, "five-dollar bill"),
            new Denomination(200, "two-dollar coin"),
            new Denomination(100, "loonie"),
            new Denomination(25, "quarter"),
            new Denomination(10, "dime"),
            new Denomination(5, "nickel"),
            new Denomination(1, "penny", "pennies")
    );

    public static void main(String[] args) throws IOException {

        System.out.println("Change Making Program");
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("Please enter the total purchase: $");
        int total = (int)(Double.parseDouble(stdin.readLine()) * 100);

        System.out.print("Please enter the amount tendered: $");
        int tendered = (int)(Double.parseDouble(stdin.readLine()) * 100);

        int change = tendered - total;

        System.out.printf("The change will be: $%.2f\n", change / 100.0);
        System.out.println("To make up this amount you will need:");

        for (Denomination denom: denominations) {
            if (change == 0)
                break;
            if (change >= denom.getValue()) {
                int count = change / denom.getValue();
                if (count > 0) {
                    change = change - denom.getValue() * count;
                    System.out.printf("%d %s\n", count, denom.getDescription(count));
                }
            }
        }

        System.out.println("Thank you for using the Change Making Program");
    }
}

示例运行:

Change Making Program
Please enter the total purchase: $1.42
Please enter the amount tendered: $20.00
The change will be: $18.58
To make up this amount you will need:
1 ten-dollar bill
1 five-dollar bill
1 two-dollar coin
1 loonie
2 quarters
1 nickel
3 pennies
Thank you for using the Change Making Program

如果 OP 要求这个问题做家庭作业,那么我希望这个答案可能“太好了”。它可能正在使用尚未在课堂上学习过的技术。即使 OP 可以按原样提交,我也会鼓励他们不要这样做。相反,我建议他们研究这个例子,从中学习,然后将学到的东西适当地融入他们自己的解决方案中。我鼓励他们就示例提出问题,我很乐意回答。

【讨论】:

    【解决方案2】:

    parseInt问题我已经监督过了,但还有一个问题:

    pennies = (change - (change % 0.1)) / 0.1;
    ...
    change = change - (pennies * 0.1);
    

    应该是0.01 而不是0.1 - 或者只使用change 中剩下的内容。

    建议:不要使用double 来赚钱——四舍五入有很多问题! (零钱机会少一分钱)
    要么使用int/ long 代表美分,要么
    使用BigDecimal

    注意 (change - (change % 100)) / 100(int)(change / 100) 基本相同 - 转换为 int 删除所有小数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多