java - 为什么输出不是预期的?
问题描述
该代码应该包含项目的应付金额和已支付的金额。然后找到硬币和美元的零钱。当我支付:41.35 并收到:50.00 时,我得到 8 美元、2 个季度、1 个一角钱、0 个镍币、4 个便士。实际上,它应该是 8 美元、2 个季度、1 个一角硬币、1 个镍币、0 个便士。
import java.util.Scanner;
public class Cashier {
private double amountDue;
private double amountReceived;
private int dollars = 0;
private int quarters = 0;
private int dimes = 0;
private int nickels = 0;
private int pennies = 0;
private double toConvert;
public Cashier(double due, double received){
amountDue = due;
amountReceived = received;
toConvert = received - due;
}
public int getDollars(){
dollars = (int)toConvert;
toConvert -= dollars;
return dollars;
}
public int getQuarters(){
quarters = (int)(toConvert/.25);
toConvert -= (.25 * quarters);
return quarters;
}
public int getDimes(){
dimes = (int)(toConvert/0.1);
toConvert -= (.1 * dimes);
return dimes;
}
public int getNickels(){
nickels = (int)(toConvert/0.05);
toConvert -= (0.05 * nickels);
return nickels;
}
public int getPennies(){
pennies = (int)(toConvert/0.01);
toConvert -= (0.01 * pennies);
return pennies;
}
public static void main(String[] args){
Scanner ask = new Scanner(System.in);
System.out.print("Enter Amount Due: ");
double amtDue = ask.nextDouble();
System.out.print("Enter Amount Received: ");
double amtReceived = ask.nextDouble();
Cashier one = new Cashier(amtDue, amtReceived);
System.out.println("Dollars = " + one.getDollars());
System.out.println("Quarters = " + one.getQuarters());
System.out.println("Dimes = " + one.getDimes());
System.out.println("Nickels = " + one.getNickels());
System.out.println("Pennies = " + one.getPennies());
}
}
解决方案
您在这里遇到的有趣问题。这就是我如何解决这个问题。我做的第一件事是尝试打印运行每个函数后剩余的更改量。我将主要功能更改为如下所示:
注意:我必须更改toConvert
为static
在主要功能中使用它
public static void main(String[] args) {
Scanner ask = new Scanner(System.in);
System.out.print("Enter Amount Due: ");
double amtDue = ask.nextDouble();
System.out.print("Enter Amount Received: ");
double amtReceived = ask.nextDouble();
TestA one = new TestA(amtDue, amtReceived);
System.out.println("change due: " + toConvert);
System.out.println("Dollars = " + one.getDollars());
System.out.println("change due: " + toConvert);
System.out.println("Quarters = " + one.getQuarters());
System.out.println("change due: " + toConvert);
System.out.println("Dimes = " + one.getDimes());
System.out.println("change due: " + toConvert);
System.out.println("Nickels = " + one.getNickels());
System.out.println("change due: " + toConvert);
System.out.println("Pennies = " + one.getPennies());
System.out.println("change due: " + toConvert);
}
输出如下所示:
Enter Amount Due: 41.35
Enter Amount Received: 50.00
change: 8.649999999999999
Dollars = 8
change: 0.6499999999999986
Quarters = 2
change: 0.14999999999999858
Dimes = 1
change: 0.04999999999999857
Nickels = 0
change: 0.04999999999999857
Pennies = 4
change: 0.009999999999998573
这告诉我,问题在于四舍五入你的double
价值观。8.65
如果程序运行正确,更改应该在第一部分。这与double
值如何存储在硬件上以及这是一个非常令人困惑的话题有关(至少对我而言)。
将值更改为,float
而不是double
它会正常工作。该网站和其他网站上有关于舍入double
值的信息,并且有一些方法可以解决它,例如格式化为 x 小数位数和舍入等,但认为将其更改float
为更容易的途径。
推荐阅读
- javascript - 如何获得动态高度
- unity3d - 如何在 Unity3D 中更改 LossyScale
- html - 如何使引导下拉菜单过渡不透明度
- c++ - 不使用堆内存的高速 CAN 数据处理
- laravel - 防止某些 Laravel 路由/页面在搜索引擎上被索引的最佳方法
- ios - ios objective c 从 UiImagepickercontroller 跳过视频预览选项
- marshalling - 如何停止wildfly-10.1加载jar依赖编组和河流编组
- android - 图像显示在 android 模拟器上,但没有显示在手机上
- java - 如何将所有图像从 ArrayList 设置为 imageViews
- c# - 在 C# 中将嵌套的 foreach 转换为 Linq