Search code examples
javabigdecimal

Calculating the amount of change due


I am noob to Java and I am trying write a program that gives the amount of change given two dollar inputs. I cannot figure out what is going on. I am specifically having trouble trying to output the coinage. So for example if a person owed $654.32 and paid $987 their change should be $332.68 which would be 2 quarters, 1 dime, 1 nickel, and 3 pinnies.

Any help is greatly appreciated!

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.");
            }


    }

Solution

  • You were nearly there, you got a bit mixed up with cBal and dBal. And the conversion of change to their .XX value.

    The correct version is below

    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.");
                }
    
        }
        }
    

    You should definitely read up on java naming and coding conventions.