[英]Why does my sum suddenly decrease?
我有一個程序,可以跟蹤您放入購物袋中的商品數量和成本,然后打印出商品數量,商品總成本,成本+稅金和平均值。
當我運行該程序並繼續添加項目時,它將能夠准確地計算出所有內容,但是突然總成本就會下降。 例如:我以每張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);
}
}
您的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);
看看線
cost = items * cost;
cost是最近添加的商品的成本($ 5)乘以商品數(3),因此成本分配為3 * $ 5 => $ 15。
您將需要要么跟蹤添加到購物車中的所有項目的價格,要么保持成本的總和並添加要添加的項目的成本。
您的ShoppingBag.place(int,float)
方法不會將新商品和成本添加到ShoppingBag.place(int,float)
袋中。 它取代了袋子中的東西,因此在任何時候袋子中的內容僅是您在最新的place
呼叫中提供的內容。
在main
方法中,您要在調用place
之前增加items
,但是place
將items
的增加值乘以cost
最新值。
同樣,您的main
方法中的這兩行也不起作用,因為被調用的方法只會返回字段的現有值,並且您絕不會將返回值分配給任何東西:
myBag.getItems();
myBag.getCost();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.