首页 > 解决方案 > 为什么输出不是预期的?

问题描述

该代码应该包含项目的应付金额和已支付的金额。然后找到硬币和美元的零钱。当我支付: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());

    }

}

标签: java

解决方案


您在这里遇到的有趣问题。这就是我如何解决这个问题。我做的第一件事是尝试打印运行每个函数后剩余的更改量。我将主要功能更改为如下所示:

注意:我必须更改toConvertstatic在主要功能中使用它

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为更容易的途径。


推荐阅读