我怎样才能舍入小数?

时间:2014-11-26 02:37:30

标签: java printing casting

我正在编写一个模拟收银机更改计算器的程序。它应该打印更改以及如何回报更改(二十,十,五,四分之一,硬币等)。

问题在于,当我编译程序时,我得到一个很大的数字。我试过把它四舍五入,但它没有用。另外,我不知道这是不是因为改变不是四舍五入而是因为我没有得到分数,我只得到10美元的账单。

P.S。我正在上高中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)");
        }



   }
}

3 个答案:

答案 0 :(得分:1)

更简单的解决方案

double d = 2.99999999;
long l = (long) d;

Math.class floor function

double d = Math.floor(2.55555) //result: 2.0
  

返回最大(最接近正无穷大)双精度值   小于或等于参数,等于数学   整数

答案 1 :(得分:1)

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

change = amtPaid - cost;

变化是11.1,应该是,但随后:

change = ((int)change * 10) / 10.0;

Casts优先于算术,因此首先 (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.099999999999994而不是11.1?

浮点舍入错误。十进制数不是100%准确; " 11.1"无法准确表达。你有几种方法可以解决它。当显示数字时,您可以舍入到两位小数,例如System.out.printf("%.2f", change)。但是,您可能希望使用int并存储美分的数量,而不是使用double并存储美元的数量。使用整数更精确,实际上,在重要应用程序中使用货币时,通常会使用整数。

答案 2 :(得分:-1)

在下面找到效果很好的代码。测试了不同的值。我们希望避免超过2个小数位,因此我添加了几个实用程序方法来做到这一点。

取消注释不同的成本值,以查看其在不同情况下的工作情况。

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

    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;
}

}