【问题标题】:Calculating the amount of change due计算应付的变化量
【发布时间】:2016-07-07 07:47:13
【问题描述】:

我是 Java 的菜鸟,我正在尝试编写一个程序,在给定两美元输入的情况下给出变化量。我无法弄清楚发生了什么。我在尝试输出造币时特别遇到了麻烦。因此,例如,如果一个人欠了 654.32 美元并支付了 987 美元,他们的零钱应该是 332.68 美元,即 2 美分硬币、1 美分和 3 便士。

非常感谢任何帮助!

import java.util.*;
import java.math.*;
import java.text.*;


public class CorrectChange {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        BigDecimal AmtDue;      
        BigDecimal AmtPaid;


        NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);

        //User enters the amount that the customer owes
        System.out.println("Enter the amount below that is due to be paid.");
        System.out.print("$");
            AmtDue = input.nextBigDecimal();

            //Converts user's input into the currency format
            AmtDue = AmtDue.setScale(2, BigDecimal.ROUND_HALF_UP);
                double dAmtDue = AmtDue.doubleValue();
                    String eAmtDue = n.format(dAmtDue);

        //User enters the amount that the customer paid     
        System.out.println("Enter the amount below that has been paid.");
        System.out.print("$");
            AmtPaid = input.nextBigDecimal();

            //Converts user's input into the currency format
            AmtPaid = AmtPaid.setScale(2, BigDecimal.ROUND_HALF_UP);
                double dAmtPaid = AmtPaid.doubleValue();
                    String eAmtPaid = n.format(dAmtPaid);

            //Checks to see if the amount paid is more than the amount owed
            if (AmtDue.compareTo(AmtPaid)> 0){
                double dBal = AmtDue.subtract(AmtPaid).doubleValue();
                String eBal = n.format(dBal);
                System.out.println("You still owe: " + eBal.toString());
            }

            //Checks to see if the amount owed is more than the amount paid
            if (AmtDue.compareTo(AmtPaid)< 0){
                int cBal = (AmtPaid.compareTo(AmtDue)*100);
                double dBal = AmtPaid.subtract(AmtDue).doubleValue();
                String eBal = n.format(dBal);


                    int DolBills = (int) (dBal / 1);
                    dBal = dBal % 1;

                    int quarters = (int) (dBal / 25);
                    dBal = dBal % 25;

                    int dimes = (int) (cBal / 10);
                    cBal = cBal % 10;

                    int nickles = (int) (cBal / 5);
                    cBal = cBal % 5;

                    //pennies = (int) (dBal / 100);
                    //dBal = dBal % 100;

                System.out.println("You owe a balance of " + eAmtDue.toString() + ". Since you paid the amount of " + eAmtPaid.toString() + " your change is " + eBal.toString());
                System.out.println("Your change amount is as follows:\n" +
                    "\t" + DolBills + " $1 dollar bills \n" +
                    "\t" + quarters + " quarters \n" +
                    "\t" + dimes + " dimes \n" +
                    "\t" + nickles + " nickels \n");
                    "\t" + numPennies + " pennies";

            }

            //Checks to see if the amount paid is equal to the amount owed
            if (AmtDue.compareTo(AmtPaid)== 0){
                    System.out.println("Your balance has been paid. Thank you for your business.");
            }


    }

【问题讨论】:

  • 使用调试器找出发生了什么
  • 您向我们展示了您的预期结果,但是当您执行程序时,您现在的结果是什么?

标签: java bigdecimal


【解决方案1】:

你快到了,你有点混淆了 cBal 和 dBal。并将变化转换为它们的 .XX 值。

正确的版本如下

import java.util.*;
import java.math.*;
import java.text.*;


public class CorrectChange {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        BigDecimal AmtDue;      
        BigDecimal AmtPaid;


        NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);

        //User enters the amount that the customer owes
        System.out.println("Enter the amount below that is due to be paid.");
        System.out.print("$");
            AmtDue = input.nextBigDecimal();

            //Converts user's input into the currency format
            AmtDue = AmtDue.setScale(2, BigDecimal.ROUND_HALF_UP);
                double dAmtDue = AmtDue.doubleValue();
                    String eAmtDue = n.format(dAmtDue);

        //User enters the amount that the customer paid     
        System.out.println("Enter the amount below that has been paid.");
        System.out.print("$");
            AmtPaid = input.nextBigDecimal();

            //Converts user's input into the currency format
            AmtPaid = AmtPaid.setScale(2, BigDecimal.ROUND_HALF_UP);
                double dAmtPaid = AmtPaid.doubleValue();
                    String eAmtPaid = n.format(dAmtPaid);

            //Checks to see if the amount paid is more than the amount owed
            if (AmtDue.compareTo(AmtPaid)> 0){
                double dBal = AmtDue.subtract(AmtPaid).doubleValue();
                String eBal = n.format(dBal);
                System.out.println("You still owe: " + eBal.toString());
            }

            //Checks to see if the amount owed is more than the amount paid
            if (AmtDue.compareTo(AmtPaid)< 0){
                double dBal = AmtPaid.subtract(AmtDue).doubleValue();
                String eBal = n.format(dBal);


                    int DolBills = (int) (dBal / 1);
                    dBal = dBal % 1.0;

                    int quarters = (int) (dBal / .25);
                    dBal = dBal % .25;

                    int dimes = (int) (dBal / .10);
                    dBal = dBal % .10;

                    int nickles = (int) (dBal / .05);
                    dBal = dBal % .05;

                    int numPennies = (int) (dBal / .01);
                    //dBal = dBal % 0.01;

                System.out.println("You owe a balance of " + eAmtDue.toString() + ". Since you paid the amount of " + eAmtPaid.toString() + " your change is " + eBal.toString());
                System.out.println("Your change amount is as follows:\n" +
                    "\t" + DolBills + " $1 dollar bills \n" +
                    "\t" + quarters + " quarters \n" +
                    "\t" + dimes + " dimes \n" +
                    "\t" + nickles + " nickels \n" +
                    "\t" + numPennies + " pennies");

            }

            //Checks to see if the amount paid is equal to the amount owed
            if (AmtDue.compareTo(AmtPaid)== 0){
                    System.out.println("Your balance has been paid. Thank you for your business.");
            }

    }
    }

您绝对应该阅读 Java 命名和编码约定。

【讨论】:

  • 感谢 Yogesh_D。您的解决方案正是我所需要的!它完美地工作。就像我说的那样,我对 Java 和一般编程非常陌生。我很想知道我犯了哪些命名和编码约定错误。
  • 我想到了一些事情,AmtPaid - 不是一个好的变量名,应该是 amtPaid,另一个例子 NumberFormat n。将方法拆分为各种较小的方法也是明智的。您可能可以优化用于存储数据的变量数量。谷歌一下java约定你应该得到一个旧的sun doc。
  • 再次感谢 Yogesh_D。在你提到它之后,我今天回过头来意识到你在说 AmtPaid 和 NumberFormat。感谢您的帮助和建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2018-06-04
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
相关资源
最近更新 更多