Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java while循环工作时出现问题,if语句读取负双精度_Java_Loops_Double - Fatal编程技术网

Java while循环工作时出现问题,if语句读取负双精度

Java while循环工作时出现问题,if语句读取负双精度,java,loops,double,Java,Loops,Double,我试图为我的java类编写的一些简单代码有两个问题。对不起,如果你们大多数人觉得这很容易,我只是从Java开始。我遇到的第一个问题是循环无法正常继续。它只运行一次就可以了,如果在开始时输入“quit”,它将退出,但在运行一次之后,它不会让用户为emp name输入另一个值。它直接从最后一行输入emp名称到循环的第一行,输入小时费率,没有机会输入新名称或退出 我的第二个问题是我的if语句试图确保为小时工资和工作小时输入的值大于0。如果输入0,则会显示错误消息,但如果输入负数,则程序会继续运行,就像

我试图为我的java类编写的一些简单代码有两个问题。对不起,如果你们大多数人觉得这很容易,我只是从Java开始。我遇到的第一个问题是循环无法正常继续。它只运行一次就可以了,如果在开始时输入“quit”,它将退出,但在运行一次之后,它不会让用户为emp name输入另一个值。它直接从最后一行输入emp名称到循环的第一行,输入小时费率,没有机会输入新名称或退出

我的第二个问题是我的if语句试图确保为小时工资和工作小时输入的值大于0。如果输入0,则会显示错误消息,但如果输入负数,则程序会继续运行,就像没有任何错误一样。如何确保输入的值仅为正双精度,并且不接受负双精度或零

// Program to Calculate Payroll
import java.util.Scanner;
import java.text.DecimalFormat;

class Payroll
{
   public static void main(String args[])
   {
   Scanner myScanner = new Scanner(System.in);
   String empName;
   double hourlyRate;
   double hoursWorked;
   double grossPay;
   double netPay;
   double taxes;
   DecimalFormat money = new DecimalFormat("$.00");
//Get User Information
   System.out.print( "Enter employee name or enter 'quit' when finished. " );
   empName = myScanner.nextLine();
   while (!empName.equals("quit"))
   {
     System.out.print( "What is their hourly rate? $");
     hourlyRate = myScanner.nextDouble();
     if (hourlyRate <= 0)
     {
         System.out.println( "Value is not valid, please enter an amount above zero.");
         System.out.print( "What is their hourly rate? $");
         hourlyRate = myScanner.nextDouble();
     }
     System.out.print( "How many hours did they work? ");
     hoursWorked = myScanner.nextDouble();
     if (hoursWorked <= 0)
     {
         System.out.println( "Value is not valid, please enter an amount above zero.");
         System.out.print( "How many hours did they work? ");
         hoursWorked = myScanner.nextDouble();
     }
//Calculate Pay and Taxes
     grossPay = hourlyRate * hoursWorked;
     taxes = .13 * grossPay;
     netPay = grossPay - taxes;
//Display All Information
     System.out.print( "Employee name: ");
     System.out.println(empName);
     System.out.print( "Hourly Rate: ");
     System.out.println(money.format(hourlyRate));
     System.out.print( "Hours Worked: ");
     System.out.println(hoursWorked);
     System.out.print( "Gross Pay = ");
     System.out.println(money.format(grossPay));
     System.out.print( "Federal Taxes = ");
     System.out.println(money.format(taxes));
     System.out.print( "Net Pay = ");
     System.out.println(money.format(netPay));
     System.out.print( "Enter employee name or enter 'quit' when finished. " );
     empName = myScanner.nextLine();
   }
   System.out.println( "Thank you for using this payroll program.");
   }
}
//计算工资单的程序
导入java.util.Scanner;
导入java.text.DecimalFormat;
班级工资单
{
公共静态void main(字符串参数[])
{
Scanner myScanner=新扫描仪(System.in);
字符串名称;
双钟头;
工作两小时;
重瓣罗缎;
双网支付;
双重征税;
十进制货币=新的十进制货币($0.00);
//获取用户信息
系统输出打印(“输入员工姓名或完成后输入“退出”);
empName=myScanner.nextLine();
而(!empName.equals(“退出”))
{
System.out.print(“他们的小时费率是多少?$”);
hourlyRate=myScanner.nextDouble();

如果(hourlyRate作为对第一个问题的响应,您不是在
while
循环中询问员工姓名。您应该在循环外初始化
empName
,但也应该在每次循环时再次询问

String empName = "";
while (!empName.equals("quit")) {
  //Get User Information  
  System.out.print( "Enter employee name or enter 'quit' when finished. " );
  empName = myScanner.nextLine();

  if (empName.equals("quit")) {
    break;
  }
对于第二个问题,您可以再次使用
while
循环并检查以确保
hourlyRate
大于
0
。只要确保每次循环检查时都重新提示即可

hourlyRate = -1;
while (hourlyRate <= 0) {
  System.out.print( "What is their hourly rate? $");
  hourlyRate = myScanner.nextDouble();
  if (hourlyRate <= 0) {
    System.out.println( "Value is not valid, please enter an amount above zero.");
  }
}
hourlyRate=-1;
while(hourlyRate)
它不允许用户为emp名称输入其他值

您只要求输入一次员工姓名,因为它不在循环中。移动代码以在循环中输入姓名。将代码添加到循环的末尾可能会被罚款,但我更喜欢在开始时进行一次检查,中途中断

如何确保输入的值仅为正双精度,并且不接受负双精度或零

// Program to Calculate Payroll
import java.util.Scanner;
import java.text.DecimalFormat;

class Payroll
{
   public static void main(String args[])
   {
   Scanner myScanner = new Scanner(System.in);
   String empName;
   double hourlyRate;
   double hoursWorked;
   double grossPay;
   double netPay;
   double taxes;
   DecimalFormat money = new DecimalFormat("$.00");
//Get User Information
   System.out.print( "Enter employee name or enter 'quit' when finished. " );
   empName = myScanner.nextLine();
   while (!empName.equals("quit"))
   {
     System.out.print( "What is their hourly rate? $");
     hourlyRate = myScanner.nextDouble();
     if (hourlyRate <= 0)
     {
         System.out.println( "Value is not valid, please enter an amount above zero.");
         System.out.print( "What is their hourly rate? $");
         hourlyRate = myScanner.nextDouble();
     }
     System.out.print( "How many hours did they work? ");
     hoursWorked = myScanner.nextDouble();
     if (hoursWorked <= 0)
     {
         System.out.println( "Value is not valid, please enter an amount above zero.");
         System.out.print( "How many hours did they work? ");
         hoursWorked = myScanner.nextDouble();
     }
//Calculate Pay and Taxes
     grossPay = hourlyRate * hoursWorked;
     taxes = .13 * grossPay;
     netPay = grossPay - taxes;
//Display All Information
     System.out.print( "Employee name: ");
     System.out.println(empName);
     System.out.print( "Hourly Rate: ");
     System.out.println(money.format(hourlyRate));
     System.out.print( "Hours Worked: ");
     System.out.println(hoursWorked);
     System.out.print( "Gross Pay = ");
     System.out.println(money.format(grossPay));
     System.out.print( "Federal Taxes = ");
     System.out.println(money.format(taxes));
     System.out.print( "Net Pay = ");
     System.out.println(money.format(netPay));
     System.out.print( "Enter employee name or enter 'quit' when finished. " );
     empName = myScanner.nextLine();
   }
   System.out.println( "Thank you for using this payroll program.");
   }
}
您只要求用户更正数字一次。如果您使用while循环,它将一直询问,直到正确的速率

它不允许用户为emp名称输入其他值

因为你的线路有问题

 hoursWorked = myScanner.nextDouble();
 empName = myScanner.nextLine();
因为这只接受双精度值,而不接受
\n
值。所以,在最后,当程序移动到行时

 hoursWorked = myScanner.nextDouble();
 empName = myScanner.nextLine();
它将继续使用
\n
作为empName,并跳过键盘上的输入 在请求输入empName值之前,需要放置另一个myScanner.nextLine()

 myScanner.nextLine();
 System.out.println("....");
 empName = myScanner.nextLine();

对于验证,只需像另一个建议的那样执行

循环的末尾确实会再次请求empName,但当我按原样运行时,它会跳过获取该输入,直接返回到循环的顶部。如果我删除循环末尾再次请求信息的最后一行,并将其更改为您建议的方式,则循环将运行一次然后不要重复第一个问题,再问一次名字。