簡體   English   中英

為什么我的金額突然減少?

[英]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 ,但是placeitems的增加值乘以cost最新值。

同樣,您的main方法中的這兩行也不起作用,因為被調用的方法只會返回字段的現有值,並且您絕不會將返回值分配給任何東西:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM