即使我在 if 语句之外定义了变量(简单计算器),我的程序也找不到 if 语句内的变量

发布于 2025-01-14 07:58:13 字数 2000 浏览 1 评论 0原文

我添加了一个 if 语句,它将输入的数字解析为双精度数,以便在第二个 if 语句块中进行计算时使用,如果仅输入数字而不是字母,则程序必须运行,程序似乎无法读取当我输入 double(5.5) 时,效果很好,但当我输入 int(5) 数字时,效果很好。

Scanner numbers = new Scanner(System.in);
Scanner operation = new Scanner(System.in);

double number1 = 0;
double number2 = 0;
String operator;


System.out.print("Enter the operator you would like to choose(+, -, *, /): ");
operator = operation.next();


System.out.print("Enter the first number: ");
String num1 = numbers.nextLine();


System.out.print("Enter your second number: ");
String num2 = numbers.nextLine();


boolean check1 = num1.trim().matches("^[0-9]+$");
boolean check2 = num2.trim().matches("^[0-9]+$");


if (check1 == true && check2 == true){
    number1 = Double.parseDouble(num1);
    number2 = Double.parseDouble(num2);
}else {
    System.out.println("Only enter numbers not letters.");
}


String calculation;
if (operator.equals("+")){
    calculation = (number1 + " + " + number2 + " = " + (number1 + number2));
    System.out.println(calculation);

}else if (operator.equals("-")){
    calculation = (number1 + " - " + number2 + " = " + (number1 - number2));
    System.out.println(calculation);

}else if (operator.equals("*")){
    calculation = (number1 + " * " + number2 + " = " + (number1 * number2));
    System.out.println(calculation);

}else if (operator.equals("/")){
    calculation = (number1 + " / " + number2 + " = " + (number1 / number2));
    System.out.println(calculation);

}else{
    calculation = operator + ":" + " Is not a valid operator!";
    System.out.println(calculation);

}

我认为这可能是 (.) 这就是问题所在, 我输出到控制台

Enter the operator you would like to choose(+, -, *, /): +
Enter the first number: 5.5
Enter your second number: 5.5
Only enter numbers not letters.
0.0 + 0.0 = 0.0 

现在 int 数字工作正常。

Enter the operator you would like to choose(+, -, *, /): +
Enter the first number: 5
Enter your second number: 5
5.0 + 5.0 = 10.0

I added a if statement that parses a entered number into a double to use when I do my calculations in the second if statement block, the program has to run if only numbers where entered and not letters, the program doesn't seem to read the numbers when I entered a double(5.5) but works fine when I enter a int(5) number/numbers.

Scanner numbers = new Scanner(System.in);
Scanner operation = new Scanner(System.in);

double number1 = 0;
double number2 = 0;
String operator;


System.out.print("Enter the operator you would like to choose(+, -, *, /): ");
operator = operation.next();


System.out.print("Enter the first number: ");
String num1 = numbers.nextLine();


System.out.print("Enter your second number: ");
String num2 = numbers.nextLine();


boolean check1 = num1.trim().matches("^[0-9]+
quot;);
boolean check2 = num2.trim().matches("^[0-9]+
quot;);


if (check1 == true && check2 == true){
    number1 = Double.parseDouble(num1);
    number2 = Double.parseDouble(num2);
}else {
    System.out.println("Only enter numbers not letters.");
}


String calculation;
if (operator.equals("+")){
    calculation = (number1 + " + " + number2 + " = " + (number1 + number2));
    System.out.println(calculation);

}else if (operator.equals("-")){
    calculation = (number1 + " - " + number2 + " = " + (number1 - number2));
    System.out.println(calculation);

}else if (operator.equals("*")){
    calculation = (number1 + " * " + number2 + " = " + (number1 * number2));
    System.out.println(calculation);

}else if (operator.equals("/")){
    calculation = (number1 + " / " + number2 + " = " + (number1 / number2));
    System.out.println(calculation);

}else{
    calculation = operator + ":" + " Is not a valid operator!";
    System.out.println(calculation);

}

I think its maybe the ( . ) thats the problem,
my output to console

Enter the operator you would like to choose(+, -, *, /): +
Enter the first number: 5.5
Enter your second number: 5.5
Only enter numbers not letters.
0.0 + 0.0 = 0.0 

And now the int numbers that works fine.

Enter the operator you would like to choose(+, -, *, /): +
Enter the first number: 5
Enter your second number: 5
5.0 + 5.0 = 10.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蛮可爱 2025-01-21 07:58:14

不要使用多个 Scanner 对象。不需要多个,而且这也可能会产生一些您不想处理的副作用。

由于您正在使用正则表达式,并且其他人建议了其他解决方案,因此我决定向您展示如何使用正则表达式来计算浮点值。正确的表达式是

[-+]?[0-9]*\\.?[0-9]+

或更好...

[-+]?\\d*\\.?\\d+

此表达式计算一个值,该值可能包含可选符号(正或负),后跟零个或多个数字,然后是可选小数点和无限数量的小数位。但是,如果使用小数点,则必须至少出现一位数字。在像 +2. 这样的情况下,仅匹配 +2

下面的代码是您的解决方案版本,稍加修改:

public static void main(String[] args) {
    final String REGEX = "[-+]?[0-9]*\\.?[0-9]+";
    Scanner scanner = new Scanner(System.in);

    double number1 = 0;
    double number2 = 0;
    String operator;
    
    System.out.print("Enter the operator you would like to choose(+, -, *, /): ");
    operator = scanner.next();

    System.out.print("Enter the first number: ");
    String num1 = scanner.next();

    System.out.print("Enter your second number: ");
    String num2 = scanner.next();
    scanner.close();

    boolean check1 = num1.trim().matches(REGEX);
    boolean check2 = num2.trim().matches(REGEX);

    if (check1 && check2) {
        number1 = Double.parseDouble(num1);
        number2 = Double.parseDouble(num2);
    }else {
        System.out.println("Only enter numbers not letters.");
    }

    String calculation;
    switch (operator) {
        case "+":
            calculation = (number1 + " + " + number2 + " = " + (number1 + number2));
            break;
        case "-":
            calculation = (number1 + " - " + number2 + " = " + (number1 - number2));
            break;
        case "*":
            calculation = (number1 + " * " + number2 + " = " + (number1 * number2));
            break;
        case "/":
            calculation = (number1 + " / " + number2 + " = " + (number1 / number2));
            break;
        default:
            calculation = operator + ":" + " Is not a valid operator!";
            break;
    }
    System.out.println(calculation);
}

主要区别是我只使用了一个 Scanner 对象,并且我用 if/else 替换了嵌套的 if/else 。代码>开关。

下面是一个示例运行

Enter the operator you would like to choose(+, -, *, /): +
Enter the first number: 5.5
Enter your second number: -7.2
5.5 + -7.2 = -1.7000000000000002

其他建议的改进是:

  1. 循环直到提供有效的运算符。没有理由等到提供所有输入后才确定由于运算符无效而无法完成计算。
  2. 对每个数字执行类似于上面 #1 的操作。
  3. 使用BigDecimal进行计算。
  4. 设置结果的格式以显示您想要显示的任意数量的小数值。

Do not use more than one Scanner object. There is no need for more than one, and this could also have some side effects you don't want to deal with.

Since you are using regular expression and others have suggested other solutions, I decided to show you how to use regular expression to evaluate a floating-point value. The correct expression for this is

[-+]?[0-9]*\\.?[0-9]+

or better yet...

[-+]?\\d*\\.?\\d+

This expression evaluates a value that may contain an optional sign (positive or negative) followed by zero or more digits, then followed by optional decimal point and an unlimited number of decimal digits. However, if the decimal point is used, at least one digit must be present. In a case like +2., only the +2 is matched.

The code below is your version of the solution, slightly modified:

public static void main(String[] args) {
    final String REGEX = "[-+]?[0-9]*\\.?[0-9]+";
    Scanner scanner = new Scanner(System.in);

    double number1 = 0;
    double number2 = 0;
    String operator;
    
    System.out.print("Enter the operator you would like to choose(+, -, *, /): ");
    operator = scanner.next();

    System.out.print("Enter the first number: ");
    String num1 = scanner.next();

    System.out.print("Enter your second number: ");
    String num2 = scanner.next();
    scanner.close();

    boolean check1 = num1.trim().matches(REGEX);
    boolean check2 = num2.trim().matches(REGEX);

    if (check1 && check2) {
        number1 = Double.parseDouble(num1);
        number2 = Double.parseDouble(num2);
    }else {
        System.out.println("Only enter numbers not letters.");
    }

    String calculation;
    switch (operator) {
        case "+":
            calculation = (number1 + " + " + number2 + " = " + (number1 + number2));
            break;
        case "-":
            calculation = (number1 + " - " + number2 + " = " + (number1 - number2));
            break;
        case "*":
            calculation = (number1 + " * " + number2 + " = " + (number1 * number2));
            break;
        case "/":
            calculation = (number1 + " / " + number2 + " = " + (number1 / number2));
            break;
        default:
            calculation = operator + ":" + " Is not a valid operator!";
            break;
    }
    System.out.println(calculation);
}

The main differences are that I used only one Scanner object and that I replaced your nested if/else with a switch.

Below is a sample run

Enter the operator you would like to choose(+, -, *, /): +
Enter the first number: 5.5
Enter your second number: -7.2
5.5 + -7.2 = -1.7000000000000002

Other recommended improvements are:

  1. Loop until a valid operator is provided. There is no reason to wait until all inputs are provided to then determine the calculation cannot be done due to invalid operator.
  2. Do something similar to #1 above for each number.
  3. Use BigDecimal the calculation.
  4. Format the result to show however many decimal values you want to show.
电影里的梦 2025-01-21 07:58:14

正则表达式“^[0-9]+$”仅对于整数计算为 true,因为它检查字符串是否由 0 - 9 组成。如果您还想检查双精度数,这可能会有所帮助:https://www.baeldung.com/java-check-string-number

第一个建议这可能是最简单的。用 try catch 包围 Double.parseDouble ,因为如果它不是数字,它会给你一个 NumberFormatException 。

The regular expression "^[0-9]+$" only evaluates to true for integers, because it checks whether the string consists of 0 - 9. If you want to check for doubles as well, this might help: https://www.baeldung.com/java-check-string-number

The first suggestion there is probably the easiest. Surround Double.parseDouble with a try catch, because it will give you an NumberFormatException if its not a number.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文