改变机器数学&逻辑错误

时间:2013-08-24 22:09:46

标签: java math double

我之前发布过这个程序,但发现我通过添加循环而不是它来过度思考它。我把它配对了一点但仍然遇到问题。该程序应该是一个改变机器。在用户输入价格之后,程序应将其四舍五入到最接近的美元,然后输出将分配多少更改以及哪些硬币计数。此时输出完全错误。我对编程非常陌生,而且我很茫然。

package changemachine;

import java.util.Scanner;
import java.text.*;

public class Main 
{

  public static void main(String[] args) 
   {   
    Scanner scan = new Scanner(System.in);

    System.out.println("Enter Purchase Price: ");

    double price = scan.nextDouble();

    int newPrice = (int)(price*100);

    int paid = (int)(newPrice+1);

    int change = (int)(paid - newPrice);

    int quarters = (int)(change/25);
    int dimes = (int)((change%25)/10);
    int nickels = (int)((change%25%10)/5);
    int pennies = (int) (change%25%10%5);

    System.out.println("Dispensing: " + quarters + " Quarters,"
          + dimes + "Dimes," + nickels + "Nickels," 
          + pennies + "Pennies.");

    System.out.println("Program written by Ashley ");
 }
}

5 个答案:

答案 0 :(得分:2)

(一旦newPriceint,您就可以停止投射每一行。)而不是将%链接在一起,它可以更具可读性(并且更不容易出错)您找到的值:

change -= 25*quarters;
dimes = change / 10;
change -= 10*dimes;
nickels = change / 5;
change -= 5*nickels;
pennies = change;

答案 1 :(得分:1)

我认为这可以帮助您了解您是否需要手动完成代码并考虑价格,新价格,付费和变更。

新价格是低于美元的价格。 付费是物品的成本。 更改是您支付的金额减去转换为整数个便士的费用。

package changemachine;

import java.util.Scanner;
import java.text.*;

public class Main 
{

  public static void main(String[] args) 
   {   
    Scanner scan = new Scanner(System.in);

    System.out.println("Enter Purchase Price: ");

    double price = scan.nextDouble();

            int newPrice = (int)(price);

            int paid = (int)(newPrice+1);

            int change = (int)((paid - price) * 100);

    int quarters = (int)(change/25);
    int dimes = (int)((change%25)/10);
    int nickels = (int)((change%25%10)/5);
    int pennies = (int) (change%25%10%5);

    System.out.println("Dispensing: " + quarters + " Quarters,"
          + dimes + "Dimes," + nickels + "Nickels," 
          + pennies + "Pennies.");

    System.out.println("Program written by Ashley ");
 }
}

答案 2 :(得分:0)

如果指令int paid= (int)(newPrice+1) ;应该舍入到下一个美元,那么它应该是:int paid= ( newPrice + 99 ) / 100 * 100 ;当两个操作数已经{{1}时,您不需要转换为(int) }}秒。使您的程序略显难以辨认。之后,按季度获得季度数=更改/ 25; int更改(that's correct in your program), you can reduce the amount from更改 - =季度​​ 25;`。

这使得计算withdimes完全相同,只是使用quarters代替10。不要忘记使用25再次减少待处理change的角钱。您可以使用change-= dimes * 10 ;重复此过程,其余nickels将为change

如果您有任何疑问,请使用调试器或使用pennies输出每个中间结果。一旦了解了程序的行为,您就可以随时删除它们。

答案 3 :(得分:0)

这就是我让Java选择我必须支付的硬币的方式。

    int temp = m;
    int quarterCoin = 25;
    int x = m/quarterCoin;
    m=m-x*quarterCoin;

    int dimeCoin = 10;
    int z = m/dimeCoin;
    m=m-z*dimeCoin;

    int nickelCoin = 5;
    int y = m/nickelCoin;
    m=m-y*nickelCoin;

    int pennyCoin = 1;
    int w = m/pennyCoin;
    m=m-w*pennyCoin;

答案 4 :(得分:-1)

我没有给你作业的答案/解决方案,而是帮助你弄清楚如何弄明白。 :)

为了充分调试您的软件并排除故障,您需要知道您的变量正在做什么。有两种方法:

  1. 附加调试器 - 大多数IDE都带有一个调试器,可以帮助您完成此任务。
  2. 将变量打印到控制台。这是我的首选方法。我和调试器从来没有很好地结合在一起。 :)
  3. 所以,如果我试图计算你的程序,我会怎么做:

    import java.util.Scanner;
    
    public class Change {
    
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
    
    //        System.out.println("Enter Purchase Price: ");
    
            double price = 5.65d;//scan.nextDouble();
    
            int newPrice = (int) (price * 100);
            System.out.println("newPrice: " + newPrice);
    
            int paid = (int) (newPrice + 1);
            System.out.println("paid: " + paid);
    
            int change = (int) (paid - newPrice);
            System.out.println("change: " + change);
    
            int quarters = (int) (change / 25);
            int dimes = (int) ((change % 25) / 10);
            int nickels = (int) ((change % 25 % 10) / 5);
            int pennies = (int) (change % 25 % 10 % 5);
    
            System.out.println("Dispensing: " + quarters + " Quarters,"
                    + dimes + "Dimes," + nickels + "Nickels,"
                    + pennies + "Pennies.");
    
            System.out.println("Program written by Ashley ");
        }
    }
    

    (注意:我只是手动在price变量中输入“5.65”而不是使用扫描仪,只是为了节省时间)

    产生输出:

    newPrice: 565
    paid: 566
    change: 1
    Dispensing: 0 Quarters,0Dimes,0Nickels,1Pennies.
    Program written by Ashley 
    

    所以,现在你可以看到你的程序出错了。你能发现它吗?