1

您好,我在为学校作业创建零钱计算器时遇到问题。它本质上是计算一定数量的货币所需的最低变化量。

  • 前任。5.36 美元:
  • 2 个玩具(2 美元)
  • 1加元(1美元)
  • 1 季度
  • 1毛钱
  • 0 镍币
  • 1便士

我已经声明我的所有变量都是双精度数,所以我可以一起计算值和总数。它似乎在整数(5.00、6.00、7.00)上运行良好,但每当我添加小数位时就会出错。就像当我说 5.25 美元时,它应该说 2 toonies 1 loonie 和 1 Quarter。我认为这可能是舍入错误或我的计算有问题。任何帮助表示赞赏。下面是代码的计算:

//Rounding to one number           
DecimalFormat oneDigit = new DecimalFormat ("#,0");

//Ask user for input
String moneyinput = JOptionPane.showInputDialog ("Welcome to the Change Caluculator. "
                + "Please Enter your amount of money in Dollars ($): ");

//Take user input and create into string.
totmoney = Double.parseDouble (moneyinput);

//Calculate number of toonies
numtoonies =  (totmoney/toonieval);

System.out.println ("There is a total of " + oneDigit.format (numtoonies) + " toonies.");

//Find new amount
totmoney = (totmoney%toonieval);

//Calculate the number of loonies
numloonies = (totmoney/loonieval);

//Find new amount
totmoney = (totmoney-numloonies);

System.out.println ("There is a total of " + oneDigit.format (numloonies) + " loonies.");

//Calculate number of quarters
numquarters = (totmoney/quarterval);

//State the about of Coins
System.out.println ("There is a total of " + oneDigit.format (numquarters) + " quarters.");
}
4

3 回答 3

3

我不太明白你为什么要使用 DecimalFormat 。你应该可以只用 mod%和 Division来解决这个问题/

这就是我解决这个问题的方法:

  1. 从用户那里获取输入(作为 5.33 格式的双精度)
  2. 通过移动小数位将其保存为 int (int value = cost * 100)
  3. 使用除法查找 toonies 的数量 (numToonies = value / toonieval)
  4. 通过 (value = value % toonieval) 找到剩余金额
  5. 对其他面额重复步骤 3 和 4

注意:您必须修改 toonies 的值以反映您使用的价格乘以 100 的事实。

于 2012-04-13T01:16:13.067 回答
1

我认为这不适用于浮点数:

totmoney = (totmoney%toonieval);

尝试

totmoney = totmoney - toonieval*numtoonies;

反而。

此外,请注意浮点值通常不适合处理货币值(因为可能存在舍入错误)。改用定点小数(基本上,以美分存储值并以美分为基础计算每个值)。

于 2012-04-13T01:17:39.647 回答
1

当您需要绝对精度时,不要使用浮点数。java 遵循的 IEEE 浮点规范甚至指出会损失精度,因为浮点规范不能正确表示所有浮点运算,它只能近似它们。解决方案是您需要将值存储在 2 个整数中,一个用于小数点左侧的数量,一个用于小数点右侧的值

于 2012-04-13T07:39:51.537 回答