Java中数字的数学表达式(字符串)

Java中数字的数学表达式(字符串),java,parsing,formula,evaluate,mathematical-expressions,Java,Parsing,Formula,Evaluate,Mathematical Expressions,我试图找到类似(JEP)的东西,它可以计算数学公式(字符串)并给出答案 但它也应该计算一个变量,例如:(25+36+x)*2=25应该给出:x=-11 有点像,但它不应该是多功能的,它应该离线工作 首选开源软件 我的小计算器项目需要它。这叫做算术评估。实现这一点最简单的方法之一是使用Edsger Dijkstra 调车场算法是一种 解析数学模型的方法 中缀符号中指定的方程式。 它可以用于在生产过程中产生输出 反向波兰符号(RPN)或作为 抽象语法树(AST)。这个 算法是由Edsger发明的 并

我试图找到类似(JEP)的东西,它可以计算数学公式(字符串)并给出答案

但它也应该计算一个变量,例如:(25+36+x)*2=25应该给出:x=-11

有点像,但它不应该是多功能的,它应该离线工作

首选开源软件


我的小计算器项目需要它。

这叫做
算术评估。实现这一点最简单的方法之一是使用Edsger Dijkstra

调车场算法是一种 解析数学模型的方法 中缀符号中指定的方程式。 它可以用于在生产过程中产生输出 反向波兰符号(RPN)或作为 抽象语法树(AST)。这个 算法是由Edsger发明的 并命名为“调车场” 因为它的运算 类似于铁路调车 院子里。与RPN的评估一样 调车场算法 基于堆栈的。中缀表达式是 数学符号的形式 人们已经习惯了,例如3+4 或3+4*(2)−1). 那里的转换 是两个文本变量(字符串) 输入和输出。还有一个 尚未保存运算符的堆栈 已添加到输出队列。转化, 程序按顺序读取每个符号 并以此为基础做了一些事情 象征

但我在一些stackoverflow用户的博客上看到了您想要的确切解决方案,但我记不起地址(就像“代码蒙克主义”)。它是一个轻量级类,可以在小程序中使用(还可以定义常量和重置值)

编辑:找到它:

线性递归数学求值器

这个数学表达式计算器诞生于需要一个占地面积小且高效的解决方案,它可以在不需要预编译的情况下合理高效地计算任意表达式。我需要一些能做变量基础数学的东西,比如:“Top+2”,“Bottom-2”和“(Right+1-Left)/2”

互联网上的研究发现了许多相当好的解决方案,所有这些解决方案都围绕着创建解析树(这很有意义)。问题是——它们都相当庞大,我不能仅仅为了数学而在applet大小上增加100K。所以我开始思考这个问题的线性递归解决方案。最终的结果是一个性能良好的单一类,没有外部依赖关系,权重小于10千磅


我发布了一个基于算法的表达式计算器,条款如下:


这不应该关闭,因为他想解一个方程,而不是寻找像javascripts eval()这样的东西。除非你将自己限制在几种形式的方程(比如线性到四次),否则这将是一个重大项目。有一些Java的。除了我的计算器不会像问题中的例子那样解方程,变量是未知的。它只能用试错法取x的各种值,然后计算
(25+36+x)*2
,直到给出的答案是25。你必须操纵这个方程,在等式的一侧得到x:我认为
(25+36+x)*2=25
x=25/2-(25+36)
,如果我没记错的话,计算(正确)到-48.5,不是-11。嗯,是的。Wolfram alpha使用了一些奇特的人工智能来修复无效的输入,
(25+36+x)*2=25
变成了
Solve[(25+36+x)*2==25,x]
,所以我假设他需要编写一个“线性系统解算器”或手动完成。哇,谢谢你的快速回复,我会检查一下,让你知道我使用的代数系统:)看起来不错:),我可能会把它添加到我的项目中。虽然对于计算器来说,java的启动速度相当慢。也许我需要修改它,然后在C++中重新开始。