为什么我的金额会突然减少?

时间:2014-08-26 01:56:47

标签: java switch-statement

我有一个程序可以跟踪您放入购物袋的商品数量和成本,然后打印出商品数量,商品总成本,成本+税金和平均值。

当我运行程序并继续添加项目时,它将准确计算所有内容,但突然之间总成本将下降。例如:我以每张10美元的价格添加2件物品:物品:2总成本:20,但随后我将以5美元的价格添加1件物品并打印:物品:3总成本:15而不是25。

我已尝试多次运行它。似乎我继续以10美元的价格添加物品是准确的,但如果我改变它,总成本会降低。当价值下降时,似乎有些是随机的。

我认为使用float可能存在一些问题,但我无法找到任何可以验证的内容。

这是购物袋类

public class ShoppingBag {

    public float taxRate;
    public int items;
    public float cost;
    public float average;
    public float totalCost;
    public float finalCost;

    public ShoppingBag(float taxRate)
    {
        this.taxRate = taxRate;
    }

    public void place(int newitems, float newcost)
    {
        items = newitems;
        cost = newcost;

        cost = items * cost;
    }

    public int getItems()
    {
        return items;
    }

    public float getCost()
    {
        return cost;
    }

    public float getTotal()
    {
        finalCost = cost + (cost * taxRate);
        return finalCost;
    }

    public float getAverage()
    {
        average = finalCost/items;
        return average;
    }

    @Override
    public String toString()
    {
        return("Items: " + items + " Cost: " + cost + " Final cost: " + finalCost + " Average cost: " + average);
    }
}

这是我的主程序

import java.util.Scanner;
public class ShoppingBagTracker {

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        float taxRate, cost;
        int items, newItems, choice;
        String receipt;
        String menu = ("1. Add items" +
        "2. Get receipt"
        + "3. Exit");

        System.out.print("Enter the sales tax rate: ");
        taxRate = in.nextFloat();
        ShoppingBag myBag = new ShoppingBag(taxRate);

        items = 0;
        do{
            System.out.println("What would you like to do?");
            System.out.println(menu);
            choice = in.nextInt();

            switch(choice){
                case 1:
                    System.out.print("Enter cost of item: ");
                    cost = in.nextFloat();     

                    System.out.print("Enter number of items: ");
                    newItems = in.nextInt();
                    items = items + newItems;

                    myBag.place(items, cost);
                    myBag.getItems();
                    myBag.getCost();
                    myBag.getTotal();
                    myBag.getAverage();
                    break;
                case 2:
                   receipt = myBag.toString();
                   System.out.println(receipt);
                   break;
                case 3:
                    break;
                default:
                    System.out.println("That is not an option");      
            }
        }while(choice != 3);            
    }    
}

3 个答案:

答案 0 :(得分:1)

您的place方法会覆盖以前的费用。

所以当你打电话时:

myBag.place(items, cost);

项目数量是正确的(因为您在通话前更新了它),但之前的费用已经丢失:

public void place(int newitems, float newcost)
{
    items = newitems;
    cost = newcost;

    cost = items * cost;
} 

您应该将其更改为:

public void place(int newitems, float newcost)
{
    items += newitems;
    cost += newitems * newcost;
} 

并传递给新项目:

myBag.place(newitems, cost);

答案 1 :(得分:1)

看一下

cost = items * cost;

成本是最近项目的成本($ 5)乘以项目数量(3),因此成本被分配3 * $ 5 => $ 15

您需要跟踪添加到购物车中的所有商品的价格,或者保持成本的累计总额并添加要添加的商品的成本。

答案 2 :(得分:0)

您的ShoppingBag.place(int,float)方法无法将新商品和费用添加到购物袋中。它替换包中的内容,因此任何时候行李的内容只是您最近拨打place时提供的内容。

main方法中,您在调用items之前递增place,但之后place仅将items的递增值相乘cost的最新值。

此外,main方法中的这两行无效,因为被调用的方法只返回字段的现有值,并且您永远不会将返回的值赋给任何内容:

  myBag.getItems();
  myBag.getCost();