Frisbee68
Frisbee68

Reputation: 67

Having troubles with doubles

after long hard work, I have finally completed (almost) my java menu program. However, I am having trouble getting my return change function to work at the end of my code. It is giving very odd numbers. Any ideas?

Code:

import java.io.*;
import java.text.*;
import java.util.*;

public class JavaBurger
{
    public static double amountowed = 0;
    public static double amount;
    public static double amount1 = 0;
    public static double amount2 = 0;
    public static double amount3 = 0;
    public static double amount4 = 0;
    public static double amount5 = 0;
    public static double amount6 = 0;
    public static double amount7 = 0;
    public static double amount8 = 0;
    public static double amount9 = 0;
    public static double amount10 = 0;


    static ArrayList MenuItems = new ArrayList();

    public static void main(String[] args)
    {
        InputStreamReader inp = null;
        BufferedReader input = null;
        int nOption  = 0;
    DecimalFormat x = new DecimalFormat("###.##");


        try
        {
            inp = new InputStreamReader(System.in);
            input = new BufferedReader(inp);
            while(true)
            {
        System.out.println("Choose a Menu Option");
                System.out.println("1. Burger - 13.49");
                System.out.println("2. Pasta - 16.79");
                System.out.println("3. Salad - 13.49");
                System.out.println("4. Salmon - 18.99");
                System.out.println("5. Chicken - 16.99");
                System.out.println("6. Nachos - 13.99");
        System.out.println("7. Soup - 6.99");
        System.out.println("8. Fajitas - 18.49");
        System.out.println("9. Ribs - 23.99");
        System.out.println("10. Calamari-9.99");
        System.out.println("11. Clear Order");
        System.out.println("12. Finish Order");
                System.out.println("\nChoose an option(1-12) >> ");
        System.out.println("Subtotal: $" + x.format(amount));
        System.out.println("Total: $" + x.format(amount * 1.13));
        System.out.println("For error correction, choose an option and enter a negative value to void the item.");

                nOption = Integer.parseInt(input.readLine());

                switch(nOption)
                {
                    case 1:
                        Burger(input);
                        break;
            case 2:
                        Pasta(input);
                        break;
            case 3:
                        Salad(input);
                        break;
            case 4:
                        Salmon(input);
                        break;
            case 5:
                        Chicken(input);
                        break;
                    case 6:
                        Nachos(input);
                        break;
                    case 7:
                        Soup(input);
                        break;
                    case 8:
                        Fajitas(input);
                        break;
                    case 9:
                        Ribs(input);
                        break;
                    case 10:
                        Calamari(input);
                        break;
            case 11:
            Clear(input);
            break;
            case 12:
            Finish(input);
            break;

                }
            }
        }
        catch(Exception exp)
        {
        }
    }

    private static void Burger(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many Burgers would you like? ");
        int a = Integer.parseInt(input.readLine());

        double aaa = Math.pow(1 + a, a);
            amount1 = (a * 13.49);
        amount += amount1;


                break;
        }
    }

     private static void Pasta(BufferedReader input) throws IOException
    {
        while(true)
        {

            System.out.println("How many orders of Pasta would you like? ");
        int b = Integer.parseInt(input.readLine());

        double bbb = Math.pow(1 + b, b);
            amount2 = (bbb * 16.79);
        amount += amount2;


                break;
        }
    } private static void Salad(BufferedReader input) throws IOException
    {
        while(true)
        {

            System.out.println("How many Salads would you like? ");
        int c = Integer.parseInt(input.readLine());

        double ccc = Math.pow(1 + c, c);
            amount3 = (ccc * 13.49);
        amount += amount3;


                break;
        }
    } private static void Salmon(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many orders of Salmon would you like? ");
        int d = Integer.parseInt(input.readLine());

        double ddd = Math.pow(1 + d, d);
            amount4 = (ddd * 18.99);
        amount += amount4;


                break;
        }
    } private static void Chicken(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many orders of Chicken would you like? ");
        int e = Integer.parseInt(input.readLine());

        double eee = Math.pow(1 + e, e);
            amount5 = (eee * 16.99);
        amount += amount5;


                break;
        }
    } private static void Nachos(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many orders of Nachos would you like? ");
        int f = Integer.parseInt(input.readLine());

        double fff = Math.pow(1 + f, f);
            amount6 = (fff * 13.99);
        amount += amount6;

                break;
        }
    } private static void Soup(BufferedReader input) throws IOException
    {
        while(true)
        {

            System.out.println("How many orders of Soup would you like? ");
        int g = Integer.parseInt(input.readLine());

        double ggg = Math.pow(1 + g, g);
            amount7 = (ggg * 6.99);
        amount += amount7;

                break;
        }
    } private static void Fajitas(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many orders of 2 Fajitas would you like? ");
        int h = Integer.parseInt(input.readLine());

        double hhh = Math.pow(1 + h, h);
            amount8 = (hhh * 18.49);
        amount += amount8;

                break;
        }
    } private static void Ribs(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many racks of Ribs would you like? ");
        int i = Integer.parseInt(input.readLine());

        double iii = Math.pow(1 + i, i);
            amount9 = (iii * 23.99);
        amount += amount9;

                break;
        }
    } private static void Calamari(BufferedReader input) throws IOException
    {

        while(true)
        {

            System.out.println("How many orders of Calamari would you like? ");
        int j = Integer.parseInt(input.readLine());

        double jjj = Math.pow(1 + j, j);
            amount10 = (jjj * 9.99);
        amount += amount10;

                break;
        }
    } private static void Clear(BufferedReader input) throws IOException
    {

    while(true)
    {

        amount = 0;

        break;
    }
    } private static void Finish(BufferedReader input) throws IOException
    {

    while(true)
    {

        DecimalFormat x = new DecimalFormat("###.##");
        System.out.println("Amount Due");
        System.out.println("**********");
        System.out.println("Subtotal:" + x.format(amount));
        System.out.println("Total:" + x.format(amount * 1.13));
        System.out.println("Please enter the amount tendered");
        int k = Integer.parseInt(input.readLine());
        double kk = Math.pow(1 + k, k);
        amountowed = ((amount * 1.13) - kk);
        if(amountowed == 0)
        {
        System.out.println("Thanks for paying with exact change!");
        System.exit(0);
        }
        else if(amountowed < 0)
        {
        System.out.println("Change due:" + x.format(amountowed * -1.00));
        System.exit(0);
        }
        else
        {
        System.out.println("Amount still owed:" + x.format(amountowed * -1.00));
        }
    }
    }
}

Result:

Choose a Menu Option
1. Burger - 13.49
2. Pasta - 16.79
3. Salad - 13.49
4. Salmon - 18.99
5. Chicken - 16.99
6. Nachos - 13.99
7. Soup - 6.99
8. Fajitas - 18.49
9. Ribs - 23.99
10. Calamari-9.99
11. Clear Order
12. Finish Order

Choose an option(1-12) >>
Subtotal: $0
Total: $0
For error correction, choose an option and enter a negative value to void the it
em.
1
How many Burgers would you like?
1
Choose a Menu Option
1. Burger - 13.49
2. Pasta - 16.79
3. Salad - 13.49
4. Salmon - 18.99
5. Chicken - 16.99
6. Nachos - 13.99
7. Soup - 6.99
8. Fajitas - 18.49
9. Ribs - 23.99
10. Calamari-9.99
11. Clear Order
12. Finish Order

Choose an option(1-12) >>
Subtotal: $13.49
Total: $15.24
For error correction, choose an option and enter a negative value to void the it
em.
12
Amount Due
**********
Subtotal:13.49
Total:15.24
Please enter the amount tendered
100
Change due:270481382942152600000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000

Why am I getting wacky numbers for the change due?

Upvotes: 1

Views: 174

Answers (5)

rahul maindargi
rahul maindargi

Reputation: 5615

First thing first ...

  1. you dont need unneccessary while loops (Fixed in below code )
  2. Math.pow(1 + a, a) not required.(Fixed in below code )
  3. amount1 , amount 2 etc can be declared as Local variable (NOT Fixed in below code ) as it dont harm
private static void Burger(BufferedReader input) throws IOException
{
    System.out.println("How many Burgers would you like? ");
    int a = Integer.parseInt(input.readLine());
  //  double aaa = Math.pow(1 + a, a);// Why THis??? 
  amount1 = ((double)a * 13.49);
    amount += amount1;

}

 private static void Pasta(BufferedReader input) throws IOException
{
    System.out.println("How many orders of Pasta would you like? ");
    int b = Integer.parseInt(input.readLine());

   // double bbb = Math.pow(1 + b, b); You dont need this 
    amount2 = ((double)b * 16.79);
    amount += amount2;

} 
private static void Salad(BufferedReader input) throws IOException
{
    System.out.println("How many Salads would you like? ");
    int c = Integer.parseInt(input.readLine());

    //double ccc = Math.pow(1 + c, c); No Need of this again 
        amount3 = ((double)c * 13.49);
    amount += amount3;

    }
} private static void Salmon(BufferedReader input) throws IOException
{

    System.out.println("How many orders of Salmon would you like? ");
    int d = Integer.parseInt(input.readLine());

    //double ddd = Math.pow(1 + d, d); No Need
    amount4 = ((double)d * 18.99);
    amount += amount4;
}
 private static void Chicken(BufferedReader input) throws IOException
 {

    System.out.println("How many orders of Chicken would you like? ");
    int e = Integer.parseInt(input.readLine());
    amount5 = ((double)e * 16.99);
    amount += amount5;

}
 private static void Nachos(BufferedReader input) throws IOException
{

    System.out.println("How many orders of Nachos would you like? ");
    int f = Integer.parseInt(input.readLine());

    amount6 = ((double)f * 13.99);
    amount += amount6;

}
 private static void Soup(BufferedReader input) throws IOException
{
    System.out.println("How many orders of Soup would you like? ");
    int g = Integer.parseInt(input.readLine());

    amount7 = ((double)g * 6.99);
    amount += amount7;

}
 private static void Fajitas(BufferedReader input) throws IOException
{
    System.out.println("How many orders of 2 Fajitas would you like? ");
    int h = Integer.parseInt(input.readLine());
     amount8 = ((double)h * 18.49);
    amount += amount8;

}
private static void Ribs(BufferedReader input) throws IOException
{
    System.out.println("How many racks of Ribs would you like? ");
    int i = Integer.parseInt(input.readLine());
     amount9 = ((double)i * 23.99);
    amount += amount9;

}
 private static void Calamari(BufferedReader input) throws IOException
{

    System.out.println("How many orders of Calamari would you like? ");
    int j = Integer.parseInt(input.readLine());

    amount10 = ((double)j * 9.99);
    amount += amount10;

}
 private static void Clear(BufferedReader input) throws IOException
{
    amount = 0;

}
private static void Finish(BufferedReader input) throws IOException
{
amountowed =amount * 1.13
DecimalFormat x = new DecimalFormat("###.##");

while(amountowed >0)
{
    System.out.println("Amount Due");
    System.out.println("**********");
    System.out.println("Subtotal:" + x.format(amount));
    System.out.println("Total:" + x.format(amountowed));
    System.out.println("Please enter the amount tendered");
    double k = Double.parseDouble(input.readLine());
   // double kk = Math.pow(1 + k, k); No Need
    amountowed = (amountowed  - k);
    if(amountowed == 0)
    {
        System.out.println("Thanks for paying with exact change!");
        System.exit(0);
    }
    else if(amountowed < 0)
    {
        System.out.println("Change due:" + x.format(amountowed * -1.00));
        System.exit(0);
    }
    else
    {
        System.out.println("Amount still owed:" + x.format(amountowed));
    }

    }
}

Upvotes: 0

Patricia Shanahan
Patricia Shanahan

Reputation: 26175

If you want a double from a string, use Double.parseDouble instead of Integer.parseInt. Do not do the extra pow calculation, that is making your results completely wrong.

More generally, throwing in random lines of code is rarely a good approach to compiler error reports. It is much better to understand what is going on, and deliberately fix that problem.

At some point, you will probably actually encounter floating point rounding error, and will again be advised to use BigDecimal instead of double.

Upvotes: 1

Jeff Foster
Jeff Foster

Reputation: 44696

 int e = Integer.parseInt(input.readLine());
 double eee = Math.pow(1 + e, e);

Let's say I want 5 things.

 double eee = Math.pow(1 + 5, 5)

This is 6 * 6 * 6 * 6 * 6 (i.e. a very big number). I think you just want a simple multiplication?

Upvotes: 1

christopher
christopher

Reputation: 27336

I'm struggling to see why you're over-complicating your change computation so much.. Can't you simply compute amount tendered - total?

Upvotes: 2

zw324
zw324

Reputation: 27180

Well... Is the following line needed here?

double kk = Math.pow(1 + k, k);

It completely messed up change computation, since you powered what the user inputs (k) + 1 to the kth power.

If you want to change it to a double, (double)k will do. Of course, for monetary computation, you'd better be using:

  1. BigDecimal
  2. cent based Integer / Long computation

Upvotes: 10

Related Questions