Java 我怎样才能把小数点舍入?

Java 我怎样才能把小数点舍入?,java,printing,casting,Java,Printing,Casting,我正在写一个程序,将模拟收银机的变化计算器。它应该打印零钱以及如何归还零钱(二十、十、五、四分之一、一角硬币等) 问题是当我编译程序时,我得到了一个很大的数字。我试着把它取整下来,但不起作用。另外,我不知道这是否是由于零钱没有取整造成的,但我不会得到美分的数字,我只得到1美元10美元的钞票 p、 我正在上一门高中的CS课程,现在我不能用其他的方法来取整它,我知道有一种方法,就像我在下面尝试过的(演员和其他东西),我现在可以使用 多谢各位 public class changeCash {

我正在写一个程序,将模拟收银机的变化计算器。它应该打印零钱以及如何归还零钱(二十、十、五、四分之一、一角硬币等)

问题是当我编译程序时,我得到了一个很大的数字。我试着把它取整下来,但不起作用。另外,我不知道这是否是由于零钱没有取整造成的,但我不会得到美分的数字,我只得到1美元10美元的钞票

p、 我正在上一门高中的CS课程,现在我不能用其他的方法来取整它,我知道有一种方法,就像我在下面尝试过的(演员和其他东西),我现在可以使用

多谢各位

public class changeCash
  {
   public static void main(String[] args)
     {

        double cost = 68.90;
        double amtPaid = 80.00;
        double change = 0;
        int twentyBill= 0;
        int tenBill = 0;
        int fiveBill = 0;
        int oneBill = 0;
        int quarters = 0;
        int dimes = 0;
        int nickels = 0;
        int pennies = 0;



        change = amtPaid - cost;

        change =  ((int)change * 10) / 10.0;
        System.out.println("Your change is " +"$" + change);

        double back = amtPaid - cost;
        if(back >= 20)
        {
            twentyBill++;
            back -= 20;
            System.out.println(twentyBill + " $20 bill(s)");
        }

        else if(back >= 10)
        {
            tenBill++;
            back -= 10;
             System.out.println(tenBill + " $10 bill(s)");
        }

        else if(back >= 5)
        {
            fiveBill++;
            back -= 5;
            System.out.println(fiveBill + " $5 bills(s)");
        }

        else if(back >= 1)
        {
            oneBill++;
            back -= 1;
            System.out.println(oneBill + " $1 bills(s)");
        }

        else if(back >= 0.25)
        {
            quarters++;
            back -= 0.25;
            System.out.println(quarters + " qaurter(s)");
        }

        else if(back >= 0.10)
        {
            dimes++;
            back -= 0.10;
            System.out.println(dimes + " dime(s)");
        }

        else if(back >= 0.05)
        {
            nickels++;
            back -= 0.05;
            System.out.println(nickels + " nickel(s)");
        }

        else if(back >= 0.01)
        {
            pennies++;
            back -= 0.01;
            System.out.println(pennies + " penny(ies)");
        }



   }
}

更简单的解决方案

double d = 2.99999999;
long l = (long) d;
数学课

返回所需的最大(最接近正无穷大)双倍值 小于或等于参数,等于数学公式 整数


有几个问题。首先,较小的一个:

change = amtPaid - cost;
变化是11.1,应该是这样,但是:

change = ((int)change * 10) / 10.0;
强制转换优先于算术运算,因此首先发生
(int)change
(结果为11),然后乘以10,再除以10.0,最后得到11.0而不是11.1

但更大的问题在于
if
语句。您有一系列的
if…else
。一旦其中一个执行,其余的
else
块将不会执行。因此,如果您有,例如:

if (back >= 20) {
    ...
} else if (back >= 10) {
    ...
} else if (back >= 5) { 
    ...
} else ...
只要一个点击,它就完成了。如果
back>=20
为false,则转到下一个。然后,如果
back>=10
为真,则执行该值,然后不执行其余值,因此您希望将它们分开,例如:

if (back >= 20) {
   ...
}
if (back >= 10) {
   ...
}
if (back >= 5) {
   ...
}
...
这会让你更接近,但你还是不太明白。例如,如果您的零钱是40怎么办?那将是两个20。但是你的
if
语句只会拿走一个20。为此,宜使用
while
循环。它也更准确地反映了现实。在现实生活中,如果你不得不给某人40美元,你不会只给他们一个20美元就走开,你会得到一个肮脏的眼神。你会一直给他们20美元,直到你欠他们的钱少于20美元。例如:

while (back >= 20) {
   ...
}
while (back >= 10) {
   ...
}
while (back >= 5) {
   ...
}
...
您希望您的代码反映实际使用的逻辑


关于您在评论中提出的问题:

。。。为什么我只得到11.0999999994美元而不是11.1美元


浮点舍入误差。十进制数字并非100%准确;“11.1”无法精确地表示。你有几种方法可以解决这个问题。当显示数字时,您可以四舍五入到两位小数,例如,
System.out.printf(“%.2f”,change)
。但是,您可能希望使用
int
存储美分数,而不是使用
double
存储美元数。使用整数更精确,事实上,在重要应用程序中使用货币时,经常使用整数

在下面找到运行良好的代码。使用不同的值进行测试。我们希望避免超过2位小数,因此我添加了几个实用方法来实现这一点

取消注释不同的成本值以查看其在不同场景中的工作情况

公共类现金{ 公共静态void main(字符串[]args){


}

此外,我可能没有看到什么,但是:
如果(返回>=20){twentyBill++;返回-=20;System.out.println(twentyBill+“$20 bill(s)”;}
实际上不会添加一堆20美元的钞票。你需要使用while循环不断添加20美元,直到没有更多的20美元可添加。此外,一旦它看到20美元,它就不会进入10美元,依此类推,因为你有其他的if,而不是if。下面是完整的代码:哦,好的,我会去掉其他的,但为什么我会得到11.09999999994美元呢ead仅为11.1?@NatCarbonell浮点舍入错误。十进制数字不是100%准确;“11.1”无法精确表示。您有几种方法可以解决此问题。当您显示数字时,您可以舍入为两位小数,例如,
System.out.printf(“%.2f”,change)
。但是,您可能希望使用
int
并存储美分数,而不是使用
double
并存储美元数。使用整数更精确,实际上,在重要应用程序中使用货币时,经常会使用整数。@NatCarbonell因为浮点precision-read..在C#中,我会告诉你使用
decimal
类型而不是
double
。不确定是否有java等价物。
BigDecimal
?@JasonC你可以在答案中添加有关浮点错误的信息。我认为这太重要了,不能隐藏在注释中。嘿!你试过我的代码了吗?我花了一些时间当我最后一次看到它时,它成功地工作了。我不知道为什么会投反对票,但让我知道你在期待什么。
while (back >= 20) {
   ...
}
while (back >= 10) {
   ...
}
while (back >= 5) {
   ...
}
...
    double cost = 65.90;
    // cost = 68.33;
    // cost = 42.27;
    double amtPaid = 80.00;
    double change = 0;

    int twentyBill = 0;
    int tenBill = 0;
    int fiveBill = 0;
    int oneBill = 0;
    int quarters = 0;
    int dimes = 0;
    int nickels = 0;
    int pennies = 0;

    change = amtPaid - cost;

    System.out.format("Your change is $ %.2f", decimalCeil(change, true));
    System.out.println();
    double back = decimalCeil(change, true);
    if (back >= 20) {
        twentyBill++;
        back -= 20;
        System.out.println(twentyBill + " $20 bill(s)");
    }

    if (back >= 10) {
        tenBill++;
        back -= 10;
        System.out.println(tenBill + " $10 bill(s)");
    }

    if (back >= 5) {
        fiveBill++;
        back -= 5;
        System.out.println(fiveBill + " $5 bills(s)");
    }

    if (back >= 1) {
        oneBill = (int) (back * 10) / 10;
        back -= oneBill;
        System.out.println(oneBill + " $1 bills(s)");
    }
    if (decimalCeil(back) >= 0.25) {
        quarters = (int) (back * 100) / 25;
        back = correct2DecimalPlaces(back, 25);
        System.out.println(quarters + " qaurter(s)");
    }
    back = (int) (decimalCeil(back, true) * 100);
    if (back >= 10) {
        dimes = (int) (back / 10);
        back = back % 10;
        System.out.println(dimes + " dime(s)");
    }
    if (back >= 5) {
        nickels = (int) (back / 5);
        back = back % 5;
        System.out.println(nickels + " nickel(s)");
    }
    if (back >= 1) {
        pennies = (int) back;
        System.out.println(pennies + " penny(s)");
    }
}

private static double correct2DecimalPlaces(double back, int modulo) {
    int correctTwoPlaces = (int) (back * 100) % modulo;
    back = (double) correctTwoPlaces / 100;
    return back;
}

private static double decimalCeil(double change) {
    int temp = (int) (change * 100);
    double tempWithCeil = Math.ceil(temp);
    double answer = tempWithCeil / 100;
    return answer;
}

private static double decimalCeil(double change, boolean decimalThreePlaces) {
    double temp = change * 1000;
    double tempWithCeil = Math.ceil(temp);
    double answer = tempWithCeil / 1000;
    return answer;
}