编写一个Java程序,要求用户输入以美元和美分表示的金额,但无法计算美分

2w3kk1z5  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(132)

我正在编写一个java程序,该程序接受一个美元金额的输入,并返回该值所包含的百位数、五十位数、二十位数、十位数、五位数、个位数、四分之一位数、一角位数、五分位数和美分位数。
输出应如下所示(但带有实际数字):

  • 0百
  • 五十
  • 二十
  • 零点十分
  • 零五
  • 0个
  • 0个季度
  • 0角
  • 0枚镍币
  • 0美分

下面是我的代码:

import java.util.Scanner;
public class Main
{
public static void main(String\[\] args)
{
double amount, quarters, dimes, nickels, pennies;
int hundreds, fifties, twenties, tens, fives, ones;

        System.out.println("Enter your dollar amount:");
    
        try (Scanner sc = new Scanner(System.in)) {
            amount = (double) sc.nextDouble();
        
         hundreds = (int)amount / 100;
         amount = amount % 100;
         fifties = (int)amount / 50;
         amount = amount % 50;
         twenties = (int) amount / 20;
         amount = amount % 20;
         tens = (int)amount / 10;
         amount = amount % 10;
         fives = (int)amount / 5;
         amount = amount % 5;
         ones = (int)amount / 1;
         amount = amount % 1;
         quarters = amount / 25;
         amount = amount % 25;
         dimes = amount / 10;
         amount = amount % 10;
         nickels = amount / 5;
         amount = amount % 5;
         pennies = amount;
    
         System.out.println("You have:");
         System.out.println(hundreds + " hundreds");
         System.out.println(fifties + " fifties");
         System.out.println(twenties + " twenties");
         System.out.println(tens + " tens");
         System.out.println(fives + " fives");
         System.out.println(ones + " ones");
         System.out.println(quarters + " quarters");
         System.out.println(dimes + " dimes");
         System.out.println(nickels + " nickels");
         System.out.println(pennies + " pennies");
         System.out.println("Goodbye!");
     }

}
}

我知道如何计算美元金额,但无法计算美分值的逻辑。我需要它作为一个整数打印出来,所以我知道金额需要在某个点转换为整数。有人能给我指出正确的方向吗?

siotufzp

siotufzp1#

由于amount是一个double,您可以执行如下操作

long totalCents = Math.round(amount * 100);

Math.round方法接受一个double值并返回最接近它的long,因此它可以向上或向下取整,还有一个版本接受一个float值并返回一个int
一旦你这样做了,把你所有的美分变成1美分、5美分、10美分和25美分的过程就和你把1美元变成20美元、10美元、5美元和1美元的过程非常相似。

zzlelutf

zzlelutf2#

溶液1:使用美分而不是美元计算:

一种方法是将输入的金额转换为整数,并以美分而不是美元为单位进行计算:

long amount, quarters, dimes, nickels, pennies;
    long hundreds, fifties, twenties, tens, fives, ones;
    double amountIn;

    System.out.println("Enter your dollar amount:");

    Scanner sc = new Scanner(System.in); 
    amountIn = (double) sc.nextDouble();
    amount = Math.round (amountIn * 100.0);
    
     hundreds = amount / 100_00;
     amount = amount % 100_00;
     fifties = amount / 50_00;
     amount = amount % 50_00;

等等。
我使用下划线字符来表示当数字是整美元时小数点的位置。[1]这可能会使代码更容易阅读。

溶液2:使用大十进制:

浮点数在表示几乎所有小数时是不准确的。这是人们更喜欢使用十进制而不是二进制进行货币计算的原因之一。
虽然现在这对O/P可能没有用,但将来O/P可能想知道如何使用Java的BigDecimal class,我想我应该通过展示在这个问题中如何使用它来扩展答案:

public static void change2() {

    int quarters, dimes, nickels, pennies;
    int hundreds, fifties, twenties, tens, fives, ones;
    BigDecimal amount;
    BigDecimal[] amountDivRemainder;

    System.out.println("Enter your dollar amount:");

    Scanner sc = new Scanner(System.in);
    amount = sc.nextBigDecimal();

    amountDivRemainder = amount.divideAndRemainder(new BigDecimal("100.00"));
    hundreds = amountDivRemainder[0].intValue();
    amount = amountDivRemainder[1];

    amountDivRemainder = amount.divideAndRemainder(new BigDecimal("50.00"));
    fifties = amountDivRemainder[0].intValue();
    amount = amountDivRemainder[1];

    amountDivRemainder = amount.divideAndRemainder(new BigDecimal("20.00"));
    twenties = amountDivRemainder[0].intValue();
    amount = amountDivRemainder[1];

等等。

离题:风格

当我看到重复的代码只有细微的差别时,我会问这个问题:代码是否可以用数组、循环和/或其他方法来改进。O/P代码有重复的模式:

c = a / b;
 a = a % b;

下面是使用数组和循环的一种方法:

public static void change3() {

    class Denomination {

        String name;
        int value;
        int quantity;

        Denomination(String name, int value) {
            this.name = name;
            this.value = value;
            this.quantity = 0;
        }
    }
    Denomination[] denomination = {
        new Denomination("Hundreds", 100_00),
        new Denomination("Fifties", 50_00),
        new Denomination("Twenties", 20_00),
        new Denomination("Tens", 10_00),
        new Denomination("Fives", 5_00),
        new Denomination("Ones", 1_00),
        new Denomination("Quarters", 25),
        new Denomination("Dimes", 10),
        new Denomination("Nickels", 5),
        new Denomination("Pennies", 1)
    };

    double amountIn;
    int amount;

    System.out.println("Enter your dollar amount:");

    Scanner sc = new Scanner(System.in);
    amountIn = (double) sc.nextDouble();
    amount = (int) Math.round(amountIn * 100.0);

    for (int i = 0; i < denomination.length; ++i) {
        denomination[i].quantity = amount / denomination[i].value;
        amount = amount % denomination[i].value;
    }

    System.out.println("The amount is distributed: ");
    for (int i = 0; i < denomination.length; ++i) {
        System.out.println(denomination[i].name + ": " + denomination[i].quantity);
    }
}

在这里,它使用class,其中每个示例都保存有关货币面值的信息:名称、以美分为单位的值和要分发的计数。计数最初为零。
使用Denomination类可以避免使用紧密耦合的数组:

String [] denominationName = {"Hundreds", "Fifites", "Twenties", ...
   int [] denominationValue = {100_00, 50_00, 20_00, ...
   int [] denominaitonCount = new int [10];

这可以适用于BigDecimal方法。
我使用了两个循环来保留O/P代码中的特性,在O/P代码中,所有计算都在打印任何结果之前完成。

备注:

[1]如果你这样做,不要使用0作为第一个数字,Java会把它解释为一个八进制值,例如,0_10将是8,而不是10分。

相关问题