在Java中将数学表达式(字符串)转换为数字

5

这个问题不应该被关闭,因为他想要解决一个方程,而不是寻找类似于Javascript的eval()之类的东西。 - stacker
2
除非你限制自己只使用一些形式的方程(例如线性到四次方程),否则这将是一个重大项目。http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems列出了一些Java系统。 - Pete Kirkham
2个回答

3
这被称为“算术表达式评估”。实现这个的最简单方法之一是使用Edsger Dijkstra的Shunting-yard_algorithm。shunting-yard算法是一种解析中缀表示法数学方程的方法。它可以用于生成逆波兰表示法(RPN)或抽象语法树(AST)的输出。该算法由Edsger Dijkstra发明,并因其操作类似于铁路调车场而命名为“shunting yard”算法。与RPN的计算类似,shunting yard算法也是基于堆栈的。中缀表达式是大多数人习惯的数学符号形式,例如3+4或3+4*(2−1)。为了进行转换,有两个文本变量(字符串),输入和输出。还有一个堆栈,保存尚未添加到输出队列中的运算符。要进行转换,程序按顺序读取每个符号,并根据该符号执行某些操作。
但是我在一些stackoverflow用户的博客上看到了你正在寻找的确切解决方案,但我记不得地址了(它就像“code monkeyism”)。它是一个轻量级的类,可以在小程序中使用(您还可以定义常量和重置值)。
编辑:找到了:http://tech.dolhub.com/Code/MathEval 一个线性递归数学计算器 这个数学表达式计算器的诞生源于需要一个小型且高效的解决方案,可以在不需要预编译的情况下相对高效地计算任意表达式。我需要一个能够处理变量、"Top+2"、"Bottom-2" 和"(Right+1-Left)/2"等表达式的基本数学运算工具。
在互联网上进行研究,发现有很多相当不错的解决方案,都围绕着创建解析树(这很有道理)展开。问题是——它们都相当笨重,我不能为了数学而将100K添加到我的小程序大小中。因此,我开始思考一个线性递归解决方案。最终的结果是一个可接受的性能单一类,没有外部依赖项,重量不到10 KiB。

2
除了我的评估器不能像问题中的示例那样解决未知变量的方程之外。它只能使用试错法采用各种x值并评估(25+36+x)*2,直到给出的答案为25。 - Lawrence Dol
1
你需要操作方程式,使得等式的一边只有x:我认为(25+36+x)*2=25 => x=25/2-(25+36),如果我记得我的数学没错的话,计算结果(正确地)是-48.5,而不是-11。 - Lawrence Dol
嗯,没错。Wolfram Alpha使用一些高级人工智能来修复无效的输入,(25 + 36 + x)*2 = 25 变成了 Solve[(25 + 36 + x)*2 == 25, x],所以我认为他需要编写一个“线性系统求解器”或手动完成它。 - Margus
哇,谢谢您的快速回复,我会检查一下并让您知道我使用了哪个代数系统 :) - Berty

0

看起来不错 :), 我可能会将它添加到我的项目中。虽然对于一个计算器来说,Java 的启动速度相当慢。也许我需要重新审查它并从 C++ 开始重新开始。 - Berty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接