输入无法获得正确的输出.11

时间:2014-03-06 05:34:23

标签: java floating-point modulus

我在学校有一项作业,我必须显示用户输入的金额的正确更改,该金额小于1.00但大于0.每个金额除了具有1的两位数之外的任何数量都有效或者是第十名的6号。例如.11,.16,.21,.26等。

这是我的代码

import java.util.Scanner;

public class AmountChange
{
   public static void main(String[] args)
   {
      //
      double amt; 
      int cents, quarter, dime, nickle, penny;

      Scanner keyboard = new Scanner(System.in);

      //To get the users input
      System.out.println("Change in Coins");
      System.out.println("---------------");
      System.out.println("Enter the amount less than $1.00, " +
                         "\nbut more than zero.");
      System.out.print("\nEnter amount: ");
      amt = keyboard.nextDouble();

      //Loop for incorrect input
      while ( amt < 0 || amt > 1.00 )
      {
         System.out.println("Please enter the amount less than $1.00,"  
                           + "\nbut more than zero.");
         System.out.print("\nRe-enter amount: ");
         amt = keyboard.nextDouble();
      }

      // 
      cents = (int)( amt * 100 + .1 );

      quarter = cents/25;
      cents %= 25;

      dime = cents/10;
      cents %= 10;

      nickle = cents/5;
      cents %= 5;

      penny = cents;

      // ----------------------------------------------------------
      if (quarter > 1)
      {
         System.out.print("\nYou will need " + quarter + " quarters, ");
      }
      else if (quarter == 1)
      {
         System.out.print("\nYou will need " + quarter + " quarter ,");
      }
      else 
      {
         System.out.print("\nYou will need no quarters, ");
      }

      // ----------------------------------------------------------
      if (dime > 1)
      {
         System.out.print(dime + " dimes, ");
      }
      else if (dime == 1)
      {
         System.out.print(dime + " dime, ");
      }
      else 
      {
         System.out.print("no dimes, ");
      }

      // ----------------------------------------------------------
      if (nickle > 1)
      {
         System.out.print(nickle + " nickles, ");
      }
      else if (nickle == 1)
      {
         System.out.print(nickle + " nickle, ");
      }
      else 
      {
         System.out.print("no nickles, ");
      }

      // ----------------------------------------------------------
      if (penny > 1)
      {
         System.out.print("and " + penny + " pennies.");
      }
      else if (quarter == 1)
      {
         System.out.print("and " + penny + " penny.");
      }
      else 
      {
         System.out.print("and no pennies.");
      }      
   }
}

2 个答案:

答案 0 :(得分:2)

啊,剪切和粘贴的乐趣: - )

if (penny > 1)
{
    System.out.print("and " + penny + " pennies.");
}
else if (quarter == 1)  // <<<<< LOOK HERE !!!
{
     System.out.print("and " + penny + " penny.");
}
else 
{
     System.out.print("and no pennies.");
}      

应该是penny,而不是quarter

事实上,实际上确实.26工作(尽管你的断言),因为quarter设置为1,与{penny相同1}}。事实上,它适用于任何值,其中季度数等于便士数(.26.52.78),但只是偶然。


顺便说一句,您可能想要考虑的另一件事是重构所有重复的代码,例如:

import java.util.Scanner;

public class Test
{
    static double getAmount(Scanner keyboard) {
        System.out.println("Enter the amount between zero and $1.00.");
        System.out.print("\nEnter amount: ");
        return keyboard.nextDouble();
    }

    static String mkeTxt (int val, String prefix, String singular, String plural) {
        if (val == 0)
            return prefix + "no " + plural;
        if (val == 1)
            return prefix + "1 " + singular;
        return prefix + val + " " + plural;
    }

    public static void main(String[] args)
    {
        double amt; 
        int cents, quarter, dime, nickle, penny;

        Scanner keyboard = new Scanner(System.in);

        System.out.println("Change in Coins");
        System.out.println("---------------");
        amt = getAmount(keyboard);
        while ( amt < 0 || amt > 1.00 )
            amt = getAmount(keyboard);

        cents = (int)( amt * 100 + .1 );
        quarter = cents/25;
        cents %= 25;
        dime = cents/10;
        cents %= 10;
        nickle = cents/5;
        cents %= 5;
        penny = cents;

        System.out.print("\nYou will need ");
        System.out.print(mkeTxt(quarter,"", "quarter", "quarters"));
        System.out.print(mkeTxt(dime,", ", "dime", "dimes"));
        System.out.print(mkeTxt(nickle,", ", "nickle", "nickles"));
        System.out.print(mkeTxt(penny," and ", "penny", "pennies"));
        System.out.println(".");
    }
}

使用函数输出提示和接受输入使得用户输入代码更容易维护,因为您只需要在一个地方更改交互。

真正的保护程序是mkTxt()函数,为您提供一个字符串,可自动神奇地调整硬币数量。它消除了if/then/elsemain()块的大量{{1}}块,在某种程度上有助于提高可读性。

如果你发现自己多次做了类似的事情,但是价值不同,那就积极地要求改变成某种描述的功能或循环。

答案 1 :(得分:1)

你只是一个简单的拼写错误! 变化:

else if (quarter == 1){
    System.out.print("and " + penny + " penny.");
} else {
    System.out.print("and no pennies.");
}

要,

else if (penny == 1){
    System.out.print("and " + penny + " penny.");
} else {
    System.out.print("and no pennies.");
}