或者市面上有没有开箱即用的 jar
例如计算
String str = “1+23-4+(4/2)^25+(4/2)^2*2.222E-6”;
如何计算呢。。。
![]() | 1 zydxn 2020-02-26 12:28:30 +08:00 ![]() ScriptEngineManager |
2 Perci 2020-02-26 12:30:55 +08:00 via Android 用夹娃实现计算器 |
![]() | 3 zydxn 2020-02-26 12:32:05 +08:00 ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName ("Javascript"); final Object eval = engine.eval("1 + 23 - 4 + (4/2)^25 + (4/2)^2*2.222E-6"); System.out.println(eval); |
![]() | 4 lqs 2020-02-26 12:33:55 +08:00 内嵌一个 JS 或 Python 解释器(记得先把 ^替换成**) |
![]() | 5 zjsxwc 2020-02-26 12:37:22 +08:00 这表达式是科学计算器的语法,js 也不支持幂运算,直接调用命令行获取运算结果呗 ``` $octave --eval "1+23-4+(4/2)^25+(4/2)^2*2.222E-6" ans = 3.3554e+07 ``` |
![]() | 6 zjsxwc 2020-02-26 12:45:20 +08:00 |
![]() | 8 kerie 2020-02-26 12:51:51 +08:00 ![]() ScriptEngineManager 太重了,可以用 exp4j。 https://www.objecthunter.net/exp4j/ |
9 xwbz2018 2020-02-26 12:54:05 +08:00 via Android ![]() <groupId>org.scijava</groupId> <artifactId>jep</artifactId> 我用的这个,可以自定义函数 |
![]() | 11 liujan 2020-02-26 13:09:13 +08:00 via iPhone qlexpress 试试 |
![]() | 12 leishi1313 2020-02-26 13:13:22 +08:00 via Android ![]() 老有人说做算法题没用,你把这俩题结合起来不就是你的需求了: https://leetcode.com/problems/valid-number/ https://leetcode.com/problems/basic-calculator-ii/ |
13 qyvlik 2020-02-26 13:37:46 +08:00 可以参考这个项目 https://github.com/qyvlik/formula,支持变量替换计算。 具体是使用 JVM 自带的 ScriptEngine,移除 ScriptEngine 内的 `quit` 等有全局影响的函数, 创建可以参考如下: https://github.com/qyvlik/formula/blob/master/src/main/java/io/github/qyvlik/formula/modules/formula/service/impl/FormulaCalculatorImpl.java#L65 创建指定 "-strict", "--no-java", "--no-syntax-extensions" 参数,创建完毕后,移除不必要的有全局副作用的 js 函数。 此外可以考虑自己练手,使用 一些编译原理、逆波兰表达式等知识,自己实现四则计算器,还可以顺手防止恶意代码注入呢。 |
14 blackFool 2020-02-26 13:53:36 +08:00 com.googlecode.aviator |
![]() | 15 chocotan 2020-02-26 13:55:12 +08:00 |
![]() | 16 xyooyx 2020-02-26 14:04:03 +08:00 中序表达式转前序表达式 |
17 jorneyr 2020-02-26 14:04:06 +08:00 也可以调用 Groovy 脚本 |
18 hhhsuan 2020-02-26 14:26:17 +08:00 轮子太多了,一搜一大把,比如这个: https://mathparser.org/ |
![]() | 19 xupefei 2020-02-26 14:38:51 +08:00 via iPhone |
20 mineqiqi 2020-02-26 15:03:23 +08:00 好像轮子挺多的 |
21 hantsy 2020-02-26 15:16:38 +08:00 @leishi1313 按照以前大学的数据结构课程,字符是不是应该用什么 FIFO 容器存放,一个个字符分析,加减乘除()有优先级不同。 |
22 HuHui 2020-02-26 15:16:54 +08:00 Apache Commons JEXL |
23 ic2y 2020-02-26 22:26:07 +08:00 |
![]() | 24 Comdex 2020-02-26 23:27:06 +08:00 via iPhone 中缀表达式 |
25 bjrjk 2020-02-27 00:09:22 +08:00 via Android 中缀表达式转后缀表达式再计算结果输出 |
![]() | 26 leishi1313 2020-02-27 05:53:57 +08:00 via Android @xupefei 3 要会员 |