我正在编写一个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!");
}
}
}
我知道如何计算美元金额,但无法计算美分值的逻辑。我需要它作为一个整数打印出来,所以我知道金额需要在某个点转换为整数。有人能给我指出正确的方向吗?
2条答案
按热度按时间siotufzp1#
由于
amount
是一个double
,您可以执行如下操作Math.round
方法接受一个double
值并返回最接近它的long
,因此它可以向上或向下取整,还有一个版本接受一个float
值并返回一个int
。一旦你这样做了,把你所有的美分变成1美分、5美分、10美分和25美分的过程就和你把1美元变成20美元、10美元、5美元和1美元的过程非常相似。
zzlelutf2#
溶液1:使用美分而不是美元计算:
一种方法是将输入的金额转换为整数,并以美分而不是美元为单位进行计算:
等等。
我使用下划线字符来表示当数字是整美元时小数点的位置。[1]这可能会使代码更容易阅读。
溶液2:使用大十进制:
浮点数在表示几乎所有小数时是不准确的。这是人们更喜欢使用十进制而不是二进制进行货币计算的原因之一。
虽然现在这对O/P可能没有用,但将来O/P可能想知道如何使用Java的
BigDecimal
class,我想我应该通过展示在这个问题中如何使用它来扩展答案:等等。
离题:风格
当我看到重复的代码只有细微的差别时,我会问这个问题:代码是否可以用数组、循环和/或其他方法来改进。O/P代码有重复的模式:
下面是使用数组和循环的一种方法:
在这里,它使用
class
,其中每个示例都保存有关货币面值的信息:名称、以美分为单位的值和要分发的计数。计数最初为零。使用
Denomination
类可以避免使用紧密耦合的数组:这可以适用于
BigDecimal
方法。我使用了两个循环来保留O/P代码中的特性,在O/P代码中,所有计算都在打印任何结果之前完成。
备注:
[1]如果你这样做,不要使用
0
作为第一个数字,Java会把它解释为一个八进制值,例如,0_10
将是8
,而不是10
分。