不接受便士的Java自动贩卖机

时间:2018-10-25 12:53:47

标签: java

所以我正在研究一个Java项目,其中涉及创建一个可根据温度调整价格的苏打水机器。我似乎无法弄清楚在接受用户付款时如何确保机器不接受便士。

我觉得我编码过度,但是我处于机智的境地,因为我不知道如何不接受便士。

import java.util.*;
import java.text.*;
public class SodaMachine extends SodaTester
{
    public static void main(String[] args)
    {
        double temp;
        double money;
        double change;
        double price1 = .50;
        double price2 = .55;
        double price3 = .60;
        double price4 = .65;
        double price5 = .75;
        double price6 = .80;
        double price7 = .85;
        double price8 = .90;
        double price9 = 1.00;

        System.out.println("Hi there! Please enter the temperature in Farenheit:");
        Scanner scan = new Scanner(System.in);
        temp = scan.nextDouble();
        DecimalFormat fmt = new DecimalFormat("0.#");

        NumberFormat fmt2 = NumberFormat.getCurrencyInstance();

        if (temp < 40 || temp > 120)
        {
            System.out.println("Invalid input. Temperature should be between 40 and 120 degrees Farenheit.");
            while (temp < 40 || temp > 120)
            {
                temp = scan.nextDouble();
                System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
                System.out.println("Invalid input. Temperature should be between 40 and 120 degrees Farenheit.");
            }
        }

        if(temp < 50 && temp >= 40)
        {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price1));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price1)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price1));
                money = scan.nextDouble();
            }
            change = money - price1;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp >= 50 && temp <= 60) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price2));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price2)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price2));
                money = scan.nextDouble();
            }
            change = money - price2;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 60 && temp <= 65) { 
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price3));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price3)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price3));
                money = scan.nextDouble();
            }
            change = money - price3;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 65 && temp <= 70) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price4));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price4)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price4));
                money = scan.nextDouble();
            }
            change = money - price4;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 70 && temp <= 75) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price5));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price5)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price5));
                money = scan.nextDouble();
            }
            change = money - price5;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 75 && temp <= 80) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price6));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price6)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price6));
                money = scan.nextDouble();
            }
            change = money - price6;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 80 && temp <= 85) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price7));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price7)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price7));
                money = scan.nextDouble();
            }
            change = money - price7;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 85 && temp <= 90) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price8));

             System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price8)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price8));
                money = scan.nextDouble();
            }
            change = money - price8;
            System.out.println("Your Change is: " + fmt2.format(change));
        }else if (temp > 90 && temp <= 120) {
            System.out.println("The rounded temperature in degrees Farenheit is: " + fmt.format(temp));
            System.out.println("The price is: " + fmt2.format(price9));

            System.out.println("Please insert amount of payment: ");
            money = scan.nextDouble();
            while (money < price9)
            {
                System.out.println("Invalid input please try again. Your total is: " + fmt2.format(price9));
                money = scan.nextDouble();
            }
            change = money - price9;
            System.out.println("Your Change is: " + fmt2.format(change));
        }
    }






















}

2 个答案:

答案 0 :(得分:2)

我不会详细介绍您当前的代码,但是您基本上想检查一下从用户模-0.05读取的十进制值是否等于0(因此它没有余)。其中的一个问题是,当您使用double时,浮点精度会干扰支票,这就是为什么您总是想使用java.math.BigDecimal进行货币计算的原因。

这里有个例子:

BigDecimal input = new BigDecimal(scanner.next());
if(input.remainder(new BigDecimal("0.05")).compareTo(BigDecimal.ZERO) == 0){
  System.out.println("Input "+input+" is valid!");
} else{
  System.out.println("Input "+input+" is not valid!");
}

对于输入"1""1.00""1.05""4.35""1.01""3.21""4.68",它将输出以下:

Input 1 is valid!
Input 1.00 is valid!
Input 1.05 is valid!
Input 4.35 is valid!
Input 1.01 is not valid!
Input 3.21 is not valid!
Input 4.68 is not valid!

Try it online.


由于BigDecimal对于Java的新用户可能会造成很大的困扰,您也许可以让用户输入以美分(例如整数)为单位的金额,在这种情况下,可能是这样的:

int input = scanner.nextInt();
if(input % 5 == 0){
  System.out.println("Input "+input+" is valid!");
} else{
  System.out.println("Input "+input+" is not valid!");
}

对于输入"100""105""435""101""321""468",它将输出以下内容:

Input 100 is valid!
Input 105 is valid!
Input 435 is valid!
Input 101 is not valid!
Input 321 is not valid!
Input 468 is not valid!

Try it online.


编辑:由于有一段时间,我用可重用的方法重新设计了您的解决方案。

请仔细查看我的工作,如果对特定部分有任何疑问,请告诉我。现在,它使用递归方法,直到用户输入有效输入为止。方法中的boolean showMessage参数仅显示一次"Please enter X"消息。

import java.lang.IllegalArgumentException;
import java.lang.NumberFormatException;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.InputMismatchException;
import java.util.Scanner;
public class SodaMachine{ 
  private static final String currencySymbol = "$";
  private static final BigDecimal roundOn = new BigDecimal("0.05");
  private Scanner scanner;
  private NumberFormat currencyFormat;

  public SodaMachine(){
    scanner = new Scanner(System.in);
    currencyFormat = NumberFormat.getCurrencyInstance();
  }

  public static void main(String[] args){
    SodaMachine sodaMachine = new SodaMachine();
    double farenheitInput = sodaMachine.enterFarenheit(true);
    System.out.println("The temperature in degrees Farenheit you've entered is: " + farenheitInput);

    BigDecimal price = sodaMachine.determinePrice(farenheitInput);
    System.out.println("The price is: " + sodaMachine.currencyFormat.format(price));

    BigDecimal payment = sodaMachine.enterPayment(price, true);

    BigDecimal change = payment.subtract(price);
    System.out.println("Your change is: " + sodaMachine.currencyFormat.format(change));
  }

  private double enterFarenheit(boolean showMessage){
    if(showMessage){
      System.out.println("Hi there! Please enter the temperature in Farenheit:");
    }

    double farenheitInput;
    try{
      farenheitInput = scanner.nextDouble();
    } catch(InputMismatchException ex){
      scanner.nextLine(); // Get rid of the invalid user-input
      System.out.println("The value you've entered is not a valid. The input should be a decimal input. Please try again.");
      return enterFarenheit(false);
    }

    if(farenheitInput < 40 | farenheitInput > 120){
      System.out.println("Invalid input. Temperature should be between 40 and 120 degrees Farenheit.");
      return enterFarenheit(false);
    }

    return farenheitInput;
  }

  private BigDecimal determinePrice(double farenheit){
    String strPrice;
    // Temperature is in the range [40, 50):
    if(farenheit >= 40 && farenheit < 50){
      strPrice = "0.50";
    }
    // Temperature is in the range [50, 60]:
    else if(farenheit >= 50 && farenheit <=60){
      strPrice = "0.55";
    }
    // Temperature is in the range (60, 65]:
    else if(farenheit > 60 && farenheit <= 65){
      strPrice = "0.60";
    }
    // Temperature is in the range (65, 70]:
    else if(farenheit > 65 && farenheit <= 70){
      strPrice = "0.65";
    }
    // Temperature is in the range (70, 75]:
    else if(farenheit > 70 && farenheit <= 75){
      strPrice = "0.75";
    }
    // Temperature is in the range (75, 80]:
    else if(farenheit > 75 && farenheit <= 80){
      strPrice = "0.80";
    }
    // Temperature is in the range (80, 85]:
    else if(farenheit > 80 && farenheit <= 85){
      strPrice = "0.85";
    }
    // Temperature is in the range (85, 90]:
    else if(farenheit > 85 && farenheit <= 90){
      strPrice = "0.90";
    }
    // Temperature is in the range (90, 120]:
    else if(farenheit > 90 && farenheit <= 120){
      strPrice = "1.00";
    }
    // Invalid temperature range:
    else{
      // Since we already validated the input-range, it should never go here,
      // but added it just in case.
      throw new IllegalArgumentException("The temperature must be in the range [40, 120]!");
    }
    return new BigDecimal(strPrice);
  }

  private BigDecimal enterPayment(BigDecimal price, boolean showMessage){
    if(showMessage){
      System.out.println("Please enter amount of payment: ");
    }

    String userInput = scanner.next();
    // Remove the optional currency symbol from the user input
    userInput = userInput.replace(currencySymbol, "");

    BigDecimal paymentInput;
    try{
      paymentInput = new BigDecimal(userInput);
    } catch(NumberFormatException ex){
      scanner.nextLine(); // Get rid of the invalid user-input
      System.out.println("The value you've entered is not a valid. The input should be a price input. Please try again.");
      return enterPayment(price, false);
    }

    if(paymentInput.compareTo(price) < 0){
      System.out.println("Your payment of " + currencyFormat.format(paymentInput) + " is too low. Please try again. The total price is: " + currencyFormat.format(price));
      return enterPayment(price, false);
    }

    if(paymentInput.remainder(roundOn).compareTo(BigDecimal.ZERO) != 0){
      System.out.println("Your payment should be rounded to " + currencyFormat.format(roundOn) + ". Please try again.");
      return enterPayment(price, false);
    }

    return paymentInput;
  }
}

Try it online.

答案 1 :(得分:0)

您的代码可以简化很多,但我将重点关注手头的问题。

我将创建一个函数来获取用户输入,确保其中不包含任何便士:

double getMoney(String prompt, Scanner scan)
{
    double money = 0;
    while(true) {   // Loop until proper input
        System.out.println(prompt);
        money = scan.nextDouble();
        // There are a few ways to determine if it has pennies.
        // I will convert to int and check if it is divisible
        // by 10 or 5
        int i = (int)Math.round(money * 100);  // Convert to pennies
        if (0 == i % 5) {
            // It's ok, return
            return money;
        }
    }
}

旁注:使用浮点数表示货币是不好的做法。浮点会引入舍入误差。最好使用整数并使用最小面额存储值。在这种情况下,便士。