如何四舍五入小数?

科西托斯

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

问题是当我编译程序时,我得到了很多。我试过将其四舍五入,但是没有用。另外,我不知道这是否是因为找零没有被四舍五入而导致的,但是我不会得到美分,我只会得到1张10美元的钞票。

ps我正在上一门高中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)");
        }



   }
}
杰森c

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

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为假,则转到下一个。然后,如果back >= 10为true,则执行该操作,然后不执行其余操作,因此您需要将它们分开,例如:

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和存储美分数使用整数更精确,实际上,在重要应用程序中使用货币时,出于这个原因经常使用整数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章