评估数学表达式 - 语法

时间:2013-01-03 08:59:45

标签: java class

评估表达式的正确语法是什么?

public double evaluate(){
    String ans = (expressionOne.getValue())+""+(SignOperator.getName())+""+expressionTwo.getValue()+"";

    return Double.parseDouble(ans);
}

expressionOne例如可以是X,他的值是5.5,例如expressionTwo可以是Y,他的值是9.0。 当我试图评估我得到的一些表达时:
线程" main"中的例外情况java.lang.NumberFormatException:对于输入字符串:" 5.5 + 9.0"

第二部分是我要打印一些我创建的表达式toString()

public String toString() {
    String ans = expressionOne.toString()+""+SignOperator.getName()+""+expressionTwo.toString()+"";
    return ans;
}

例如:

    Variable x = new Variable ('x',5.5);
    Variable y = new Variable ('y', 3.5);
    Constant  nine= new Constant (9.0);
    Operator plus=new Operator('+');


    BinaryExpression xPy = new BinaryExpression(x, plus, y);
    BinaryExpression xP9 = new BinaryExpression(x, plus,nine);

当我打印xPy时会给我x + y。 当我打印xP9时 - 它会给我x + 9(因为九是恒定的)。
如何在一个toString中检查表达式是否为常量(只是一个数字)或变量(如示例中所示) - 如何检测它?

修改
正如你所看到的,有两种BinaryExpression - 其中一种是xPy - x,y是两种变量,如果我想评估它们会给我举例(3.0 + 5.0),但是如果我打印它们会给出我x + y,对于第二个例子xP9 - 如果我将评估它将给我(3.0 + 9.0),但如果我将打印它们将给我(x + 9.0)因为九是常数(见问题)。

感谢。

4 个答案:

答案 0 :(得分:0)

对于评估,您需要自己评估,Double.parseDouble()不会为您评估表达式,然后返回结果

Double.parseDouble()接受一个可表达为double的字符串(你知道“1223.456”确实是一个双重值,它是字符串形式,而“123.45 + 153.4”不是因为它包含“+”字符使得它无效的双值)

如何在一个toString中检查表达式是否为常量(只是一个数字)或变量

您可以使用Character.isDigit()方法来了解表达式是数字(数字)还是变量(非数字)

See the Character class API docs

答案 1 :(得分:0)

为什么要在evaluate()中创建描述操作的String? 你应该在那里进行双打操作。

我建议在类Operator中添加一个方法:

double apply(double left, double right) 

使用适当的实现类。

Operator plus = new Operator('+')
{
    double apply(double left, double right) { return left + right; }
};

然后你只需在你的评估方法中调用apply

答案 2 :(得分:0)

我希望这会帮助你在哪里尝试评估整个表达式并为你提供结果。

我知道您正在尝试编写Expression Evaluator引擎,您可以在其中使用以下帖子中使用的脚本引擎。

Usage of script engine for evaluating string expressions

答案 3 :(得分:-1)

如果要进行算术评估,请查看infixpostfix符号。例如:

在修复符号中:

y = 4 + 9 + 3 / 6 * 5;

修复后符号:

y = 4 9 3 6 / 5 * + +;

<强> Refrence http://scriptasylum.com/tutorials/infix_postfix/algorithms/infix-postfix/index.htm