JAVA 表达式计算

Calc是一个用Java编写的算术表达式计算工具。它能够直接解析一个字符串形式的算术表达式并计算出结果。

Calc使用下面的语法:

E ->  I | E + I | E - I
I -> U | I * U | I / U
U -> + U | - U | <浮点数> | ( E ) | <函数> | PI | E

其中,<浮点数>是一个符合java规范格式的10进制浮点数,PI是圆周率,E是自然对数的底。

<函数>实现了一些常用函数,函数的一般形式是:

<函数名> ( <参数>... )

参数也是一个表达式(即E),可用的函数列表则请参考图形界面或java.lang.Math的帮助文档。

Calc内部使用双精度浮点型(double)进行运算,一个正确的表达式经Calc计算所得的结果应该等于相应java表达式的结果。

示例代码:
import yyq.prod.calc.Calculator;
...
double result = Calculator.calc("1 + 2 + sin(1)");
System.out.println(result);

 

 

转自http://www.blogjava.net/20070716/archive/2011/02/12/185527.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java表达式计算可以使用Java自带的表达式计算库,也可以手动实现表达式计算。 使用Java自带的表达式计算库可以通过以下步骤实现: 1. 引入Java自带的表达式计算库:`import javax.script.ScriptEngineManager;` 2. 创建ScriptEngine对象:`ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript");` 3. 调用eval方法计算表达式:`Object result = engine.eval(expression);` 其中,expression为需要计算表达式,result为计算结果。 例如,计算表达式"1+2*3"的值,可以通过以下代码实现: ``` import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class ExpressionCalculator { public static void main(String[] args) throws ScriptException { String expression = "1+2*3"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); Object result = engine.eval(expression); System.out.println(result); } } ``` 输出结果为7。 手动实现表达式计算可以使用栈来实现。具体步骤如下: 1. 将表达式转换为后缀表达式(逆波兰表达式)。 2. 遍历后缀表达式,如果是数字,则入栈;如果是运算符,则从栈中弹出两个数进行运算,并将结果入栈。 3. 遍历完后缀表达式,栈中剩下的数就是表达式计算结果。 例如,计算表达式"1+2*3"的值,可以通过以下代码实现: ``` import java.util.Stack; public class ExpressionCalculator { public static void main(String[] args) { String expression = "1+2*3"; String[] postfix = toPostfix(expression); int result = calculate(postfix); System.out.println(result); } private static String[] toPostfix(String expression) { Stack<Character> stack = new Stack<>(); StringBuilder postfix = new StringBuilder(); for (int i = 0; i < expression.length(); i++) { char ch = expression.charAt(i); if (Character.isDigit(ch)) { postfix.append(ch); } else { while (!stack.isEmpty() && priority(stack.peek()) >= priority(ch)) { postfix.append(stack.pop()); } stack.push(ch); } } while (!stack.isEmpty()) { postfix.append(stack.pop()); } return postfix.toString().split(""); } private static int calculate(String[] postfix) { Stack<Integer> stack = new Stack<>(); for (String token : postfix) { if (Character.isDigit(token.charAt(0))) { stack.push(Integer.parseInt(token)); } else { int b = stack.pop(); int a = stack.pop(); int result = 0; switch (token) { case "+": result = a + b; break; case "-": result = a - b; break; case "*": result = a * b; break; case "/": result = a / b; break; } stack.push(result); } } return stack.pop(); } private static int priority(char ch) { switch (ch) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } } ``` 输出结果为7。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值