如何在Java中正确返回money双变量

如何在Java中正确返回money双变量,java,variables,currency,Java,Variables,Currency,我目前正在为学校做一个作业,我需要写一个程序,它需要在这个模式下返回您的更改 输入: 购买金额:12.45美元 givenAmount:$15.00 输出: 变动:2.55美元 2张一美元的钞票 两个季度 1镍币 但是,如果我使用这个案例场景,它可以正常工作。现在,如果我想让这个场景起作用,我得到了什么 输入: 购买金额:19.51美元 givenAmount:$50.01 输出: 二十美元钞票1 十美元钞票:1 宿舍:1 一角硬币:2 便士:4 这是不正确的,因为我要回到客户30.49而不是3

我目前正在为学校做一个作业,我需要写一个程序,它需要在这个模式下返回您的更改

输入: 购买金额:12.45美元 givenAmount:$15.00

输出: 变动:2.55美元 2张一美元的钞票 两个季度 1镍币

但是,如果我使用这个案例场景,它可以正常工作。现在,如果我想让这个场景起作用,我得到了什么

输入: 购买金额:19.51美元 givenAmount:$50.01

输出:

二十美元钞票1 十美元钞票:1 宿舍:1 一角硬币:2 便士:4

这是不正确的,因为我要回到客户30.49而不是30.5

我想不出这里有什么问题

谢谢

 boolean isFiveBillOn = false, isTwentybillOn = false, isTenbillOn = false, isDollarOn = false, isQuartersOn = false, isDimesOn = false, isNicklesOn = false, isPenniesOn = false;

    //retrieve amount due
    String moneyd = JOptionPane.showInputDialog("Enter the amount due");
    double amountd = Double.parseDouble(moneyd);

    String moneyr = JOptionPane.showInputDialog("Enter amount you would like to pay");
    double amountr = Double.parseDouble(moneyr);

    //calculate difference
    double difference = (amountr - amountd);

    //convert to pennies
    int balance = (int)(difference * 100);

    //twenty dollar bill
    int twentydollars = balance / 2000;
    balance = (balance % 2000);
    if (twentydollars > 0) {
        isTwentybillOn = true;
    }

    //ten dollar bill
    int tendollars = balance / 1000;
    balance = (balance % 1000);
    if (tendollars > 0) {
        isTenbillOn = true;
    }

    //five dollar bill
    int fivedollars = balance / 500;
    balance = (balance % 500);
    if (fivedollars > 0) {
        isFiveBillOn = true;
    }

    //dollar bill
    int dollars = balance / 100;
    balance = (balance % 100);
    if (dollars > 0) {
        isDollarOn = true;
    }

    //quartes
    int quarters = balance / 25;
    balance = (balance % 25);
    if (quarters > 0) {
        isQuartersOn = true;
    }

    //dimes
    int dimes = balance / 10;
    balance = (balance % 10);
    if (dimes > 0) {
        isDimesOn = true;
    }

    //nickles
    int nickles = balance / 5;
    balance = (balance % 5);
    if (nickles > 0){
        isNicklesOn = true;
    }

    //pennies
    int pennies = balance / 1;
    balance = (balance % 1);
    if (pennies > 0){
        isPenniesOn = true;
    }

    //checking for difference over 0
    if (difference < 0) {
        JOptionPane.showMessageDialog(null, "The amount received can't be less than the amount owned");
    } else {
        // Returning Message
        } if (isTwentybillOn) {
                    System.out.println("Twenty dollar bill " + twentydollars);
        } if (isTenbillOn) {
                    System.out.println("Ten dollar bill: " + tendollars);
        } if (isDollarOn) {
                    System.out.println("One Dollar Bill: " + dollars);
        } if (isQuartersOn) {
                    System.out.println("Quarters: " + quarters);
        } if (isDimesOn) {
                    System.out.println("Dimes: " + dimes);
        } if (isNicklesOn) {
                    System.out.println("Nickles: " + nickles);
        } if (isPenniesOn) {
                    System.out.println("Pennies: " + pennies);
        } else {
            System.out.println("Thanks! have a good day");
        }
    }
布尔值isFiveBillOn=false,isTwentybillOn=false,isTenbillOn=false,isDollarOn=false,isQuartersOn=false,isDimesOn=false,isNicklesOn=false,isPenniesOn=false;
//取回到期金额
String moneyd=JOptionPane.showInputDialog(“输入到期金额”);
double amountd=double.parseDouble(moneyd);
String moneyr=JOptionPane.showInputDialog(“输入您想要支付的金额”);
double amuntr=double.parseDouble(moneyr);
//计算差额
双差=(amountr-amountd);
//兑换成便士
整数余额=(整数)(差额*100);
//二十美元钞票
整数二十美元=余额/2000;
余额=(余额%2000);
如果(二十美元>0){
isTwentybillOn=true;
}
//十美元钞票
内部钢筋束=平衡/1000;
余额=(余额%1000);
如果(钢筋束>0){
isTenbillOn=真;
}
//五美元钞票
整数五美元=余额/500;
余额=(余额%500);
如果(五美元>0){
isFiveBillOn=真;
}
//美元钞票
整数美元=余额/100;
余额=(余额%100);
如果(美元>0){
isDollarOn=真;
}
//夸脱
国际季度=余额/25;
余额=(余额%25);
如果(四分之一>0){
isQuartersOn=真;
}
//一角硬币
整数十美分=余额/10;
余额=(余额%10);
如果(一角硬币>0){
isDimesOn=true;
}
//刻痕
int nickles=余额/5;
余额=(余额%5);
如果(刻痕>0){
伊斯尼克森=真;
}
//便士
整数便士=余额/1;
余额=(余额%1);
如果(便士>0){
isPenniesOn=true;
}
//检查差异是否超过0
如果(差异<0){
showMessageDialog(null,“收到的金额不能小于拥有的金额”);
}否则{
//回信
}如果(isTwentybillOn){
System.out.println(“二十美元钞票”+二十美元);
}如果(伊斯滕比隆){
System.out.println(“十美元钞票:“+tendollars”);
}如果(isDollarOn){
System.out.println(“一美元钞票:+美元”);
}如果(isQuartersOn){
系统输出打印项次(“季度:+季度”);
}if(isDimesOn){
System.out.println(“一角:+一角”);
}如果(伊斯尼克尔森){
System.out.println(“Nickles:+Nickles”);
}if(isPenniesOn){
System.out.println(“便士:+便士”);
}否则{
System.out.println(“谢谢!祝您愉快”);
}
}

千万不要使用
双精度
或任何其他浮点数据类型来表示货币。原因是它们不能准确地表示所有的值。例如,以下行:

System.out.println(new BigDecimal(0.1));
印刷品

0.1000000000000000055511151231257827021181583404541015625
有关原因的详细解释,请参阅

我建议改用


如果您只想使用原语,另一种方法是使用
int
以美分为单位存储货币值,并在显示值时除以100。

您永远不应该使用
双精度
或任何其他浮点数据类型来表示货币。原因是它们不能准确地表示所有的值。例如,以下行:

System.out.println(new BigDecimal(0.1));
印刷品

0.1000000000000000055511151231257827021181583404541015625
有关原因的详细解释,请参阅

我建议改用


如果您只想使用原语,另一种方法是使用
int
以美分为单位存储货币值,并在显示值时除以100。

不要使用
double
表示货币。使用
BigDecimal
或其他精确的数据类型。@Keppil-您能解释一下原因吗?因为浮点数不能代表任意实数。它总是一个近似值是的,一般来说,你不应该用浮点数/双倍数来表示货币(除非你在做股票市场分析,不需要精确到一分钱的结果)。至于原因,您已经在上面演示了。的可能副本不要使用
double
表示货币。使用
BigDecimal
或其他精确的数据类型。@Keppil-您能解释一下原因吗?因为浮点数不能代表任意实数。它总是一个近似值是的,一般来说,你不应该用浮点数/双倍数来表示货币(除非你在做股票市场分析,不需要精确到一分钱的结果)。至于原因,你已经在上面演示过了。谢谢你的回答。还有别的办法吗?我的教授还没有超过10岁。此项目不应包括BigDecimal和任何其他建议。@user324191:我使用
int
添加了一个替代解决方案。谢谢您的回答。还有别的办法吗?我的教授还没有超过10岁。此项目不应包含BigDecimal和任何其他建议。@user324191:我使用
int
添加了一个替代解决方案。