Java程序美元零钱计算求助:美分部分整数输出实现
解决Java货币找零程序的美分计算问题
你的问题核心在于用double类型处理货币会导致精度丢失,而且美分部分的计算逻辑错误——你直接用美元小数除以硬币面值(比如0.25美元除以25),得到的是0.01而不是1,这显然不符合需求。
正确的做法是把所有金额转换成整数形式的美分来计算,这样既避免浮点误差,又能直接用整数除法得到硬币数量。具体步骤如下:
1. 转换输入为整数美分
把用户输入的美元金额乘以100,再用Math.round()四舍五入后转成int,得到总美分数。这一步能解决double的精度问题(比如0.29美元可能被存储为0.2899999999999999)。
2. 拆分美元与美分
总美分数除以100得到美元总数,用于计算纸币数量;总美分数取模100得到剩余美分数,用于计算硬币数量。
3. 用整数运算计算硬币数量
所有硬币面值都是美分的整数,直接用剩余美分数除以硬币面值得到数量,取模得到剩余美分,依次处理即可。
修改后的完整代码
import java.util.Scanner; public class Main { public static void main(String[] args) { int hundreds, fifties, twenties, tens, fives, ones; int quarters, dimes, nickels, pennies; int totalCents; System.out.println("Enter your dollar amount:"); try (Scanner sc = new Scanner(System.in)) { double inputAmount = sc.nextDouble(); // 转换为整数美分,避免浮点精度问题 totalCents = (int) Math.round(inputAmount * 100); // 计算纸币部分 int dollars = totalCents / 100; hundreds = dollars / 100; dollars = dollars % 100; fifties = dollars / 50; dollars = dollars % 50; twenties = dollars / 20; dollars = dollars % 20; tens = dollars / 10; dollars = dollars % 10; fives = dollars / 5; ones = dollars % 5; // 计算硬币部分 int cents = totalCents % 100; quarters = cents / 25; cents = cents % 25; dimes = cents / 10; cents = cents % 10; nickels = cents / 5; pennies = cents % 5; // 输出结果 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 + " cents"); System.out.println("Goodbye!"); } } }
关键说明
- 放弃用
double处理货币:浮点类型无法精确表示所有十进制小数,会导致计算误差,这是货币处理的大忌。 - 整数运算保证准确性:所有纸币和硬币的数量都是整数,用整数除法和取模就能准确拆分,不需要复杂的类型转换。
Math.round()的作用:确保输入的小数(比如1.9999999999)能正确转成200美分,避免因浮点存储误差导致的少算或多算。
内容的提问来源于stack exchange,提问作者jose013
相关产品推荐
相关产品推荐

