我有一个程序可以跟踪您放入购物袋的商品数量和成本,然后打印出商品数量,商品总成本,成本+税金和平均值。
当我运行程序并继续添加项目时,它将准确计算所有内容,但突然之间总成本将下降。例如:我以每张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);
}
}
答案 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();