Java中的固有数学运算

时间:2016-09-20 23:19:07

标签: java-8 symbolic-math

我写的是一个小型的calaculator,你输入两个数字,一个操作数,如“+, - ,*,/”等,它将预先形成该功能。

我最初的想法是让用户输入变量,而不是将它们计算为估算值。我想这样做,以避免写几个if else语句并保持一些清洁。但我找不到一个解释如何固有地计算价值和估算字符的地方。

package hw2p1;

import java.util.Scanner;
import javax.script.*;

public class Calculator {
public static void PrintCalculator(){

    Scanner input = new Scanner(System.in);

    double num1; //1st entered number 
    double num2; //2nd entered number
    String val1; //Math operator like + - * /.
    double math1; //the results.
    String equation = "";


    System.out.print("Enter the first number:"); 
        num1 = input.nextDouble();
    System.out.print("Enter the second number:"); 
        num2 = input.nextDouble(); 
    System.out.print("Enter an operator:");
        val1 = input.next();

我知道这是不完整的,但我不知道/找不到如何将三个输入值串在一起并计算它们的逻辑。

3 个答案:

答案 0 :(得分:1)

我无法移除if-else,但您可以尝试这样的

public static void main(String[] args) {
    int result = operate("+").applyAsInt(10, 20);
    System.out.println(result);
}

private static IntBinaryOperator operate(String op){
    switch(op){
    case "+": return Math::addExact;
    case "-": return Math::subtractExact;
    //other cases
    }
    throw new RuntimeException("incorrect operator");
}

但有一个问题,Math没有双重方法

答案 1 :(得分:1)

最简单的解决方案是

public static double calculate(double a, String op, double b) {
    switch(op) {
        case "+": return a+b;
        case "-": return a-b;
        case "*": return a*b;
        case "/": return a/b;
        case "%": return a%b;
        case "^": return Math.pow(a, b);
        default: throw new IllegalArgumentException("no such operator '"+op+"'");
    }
}

在语义上等同于if - else语句的序列,但是清楚地表明了意图并且可能更有效,尽管在这里推测性能并不值得。

可以像

一样调用它
double math1 = calculate(num1, val1, num2); //the results.

但你真的应该重新调整你的变量命名方案。如果你必须附上一条评论,说明每个声明背后的目的,那么你显然做错了。为什么不命名变量,例如首先是firstInputNumbersecondInputNumberoperatorresult?然后,您不需要注释来告诉变量的用途。

答案 2 :(得分:0)

<强> TL;博士

您必须明确声明“+”表示添加。

Long Anwser

当用户在程序运行时输入内容时,所有内容都只是字符。由您的程序来解释这些字符以做一些有意义的事情。 Scanner可以对此有所帮助,因为它知道如何将字符1234解释为int。但是,除了内置类型的数据之外,Scanner完全是愚蠢的。

在构建自己的计算器程序时,您基本上是在编写Java编译器的简化版本。编译器是一个程序,它从文件中读取字符并将它们转换为可以在Java虚拟机上执行的内容。你将在自己的计算器程序中做同样的事情。这意味着您必须明确地将用于解释表示数学运算符的字符的规则编写到它们实际执行的操作中。

如果您有兴趣了解有关此主题的更多信息,可以对编译器和解释器进行一些研究。它们通常由两部分组成:词法分析器,词法分析器和解析器。如果您希望允许用户输入完整的数学表达式(如2 + 3)而不是单独提示它们表达每个表达式,那么这一点尤为必要。

我希望这会为您提供一些可以在Google搜索中使用的术语。