发个我写的计算公式代码:
package org.yangzc.math;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 数据计算公式
* @author yangzc
*
*/
public class MathEval {
public static char PLUS = '+';
public static char MINUS = '-';
public static char MULTI = '*';
public static char DEVIDE = '/';
public static char BRACKET_LEFT = '(';
public static char BRACKET_RIGHT = ')';
/**
* 计算带小括号的公式
* @param line
* @return
*/
public static double eval(String line){
while(line.indexOf(BRACKET_LEFT) != -1){
Pattern pattern = Pattern.compile("\\(([^\\(\\)]*?)\\)");
Matcher matcher = pattern.matcher(line);
while(matcher.find()){
double result = simpleEval(matcher.group(1));
line = line.replace(matcher.group(), result+"");
}
}
return simpleEval(line);
}
/**
* 计算不带括号的公式
* @param line
* @return
*/
@SuppressWarnings("unchecked")
public static double simpleEval(String line){
Stack<Double> valueStack = new Stack<Double>();//保存值的堆栈
Stack<Character> markStack = new Stack<Character>();//保存符号的堆栈
char ch[] = line.toCharArray();
//计算乘除操作
String tmpValue = "";
boolean isOper = false;
for(int i=0; i< ch.length; i++){
if( ch[i] == PLUS || ch[i] == MINUS || ch[i] == MULTI || ch[i] == DEVIDE) {
double dv = Double.valueOf(tmpValue).doubleValue();
if(isOper){
double dv1 = valueStack.pop();
char op = markStack.pop();
double result = simpleTwoEval(op, dv1, dv);
dv = result;
}
valueStack.push(dv);
markStack.push(ch[i]);
tmpValue = "";
isOper = false;
if( ch[i] == MULTI || ch[i] == DEVIDE )
isOper = true;
}else{
tmpValue += ch[i] + "";
if(i == ch.length -1){
double dv = Double.valueOf(tmpValue).doubleValue();
if(isOper){
double dv1 = valueStack.pop();
char op = markStack.pop();
double result = simpleTwoEval(op, dv1, dv);
dv = result;
}
valueStack.push(dv);
}
}
}
// for(int i=0; i< valueStack.size(); i++){
// System.out.println(valueStack.get(i));
// }
// for(int i=0; i< markStack.size(); i++){
// System.out.println(markStack.get(i));
// }
//计算加减操作
valueStack = (Stack<Double>) reverseStack(valueStack);
markStack = (Stack<Character>) reverseStack(markStack);
while(valueStack.size() > 1){
double v1 = valueStack.pop();
double v2 = valueStack.pop();
char op = markStack.pop();
double result = simpleTwoEval(op, v1, v2);
valueStack.push(result);
}
return valueStack.get(0);
}
/**
* 把整个堆栈翻转
* @param stack
* @return
*/
@SuppressWarnings("unchecked")
private static Stack<?> reverseStack(Stack<?> stack){
Stack reverse = new Stack();
int stackSize = stack.size();
for(int i=0; i< stackSize; i++){
reverse.push(stack.pop());
}
return reverse;
}
/**
* 只计算简单的两个数结果
* @param op
* @param value1
* @param value2
* @return
*/
private static double simpleTwoEval(char op, double value1, double value2){
if(op == PLUS){
return value1 + value2;
}else if(op == MINUS){
return value1 - value2;
}else if(op == MULTI){
return value1 * value2;
}else if(op == DEVIDE){
return value1 / value2;
}
return 0;
}
public static void main(String[] args) {
double result = MathEval.eval("1+(2*(3+2))-6+(3/2)+4/2");
System.out.println();
System.out.println(result);
}
}
分享到:
相关推荐
在Java编程语言中,公式计算是一项常见的需求,特别是在科学计算、数据分析、数学建模等领域。为了简化这方面的代码编写,开发者经常会将各种计算操作封装成方法,以便在项目中直接调用。标题“java 公式计算汇总,...
然而,如果你提供的压缩包"java实现eval函数"包含的是一个Java项目,那么它很可能是实现了类似功能的自定义解决方案,可能是一个解析器或者编译器,用于处理特定的表达式或脚本语法。这个项目可能包括以下几个部分:...
本程序使用java实现复合辛普森求积公式,使用者可自行修改求积函数
使用Java 语言,实现了皮尔森和余弦相似度公式,供大家参考。
`src`目录则是源代码所在的地方,我们可以在这里找到实现公式解析的核心类。这些类可能包括一个解析器类,它使用某种解析策略(如递归下降解析、LL解析或LR解析),以及一个求值器类,它负责执行解析后的AST。源码...
数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) ...
Java提供了丰富的API和工具来帮助开发者实现这一功能,但具体实现方式取决于计算公式的复杂程度和项目需求。通过学习和实践,我们可以掌握这项技能,从而在实际工作中高效地处理各种字符串计算任务。
在这个项目中,作者使用Java实现了曲线和直线的拟合功能。 在Java中,曲线拟合通常涉及到数值分析和线性代数的知识。首先,我们需要理解数据点的坐标,这些点可以表示为`(x, y)`对,其中`x`是自变量,`y`是因变量。...
《JAVA数学计算包:Apache Commons Math3库的深度解析》 在Java编程环境中,进行复杂的数学计算和统计分析是一项常见的任务。Apache Commons Math3库,作为JAVA数学计算包,为开发者提供了强大的工具,使得在Java中...
在Java编程语言中实现二十四节气的计算是一项有趣且实用的任务。二十四节气是中国传统历法的重要组成部分,它反映了地球在公转轨道上的位置变化,与农业生产、气候、民俗活动等紧密相关。以下是对这个话题的详细阐述...
在实现上,可以创建一个`LeaveDaysCalculator`类,包含计算请假天数的方法,如`calculateLeaveDays(Date startDate, Date endDate)`。使用Java 8的日期时间API(`java.time`包)来处理日期和时间,如计算两个日期...
总之,Java实现七参数转换功能涉及到坐标转换理论、数学运算和编程技巧,通过"SevenParamsDemo"这样的实践项目,开发者可以深入理解并应用这一技术。在实际工作中,这样的转换功能对于地理信息系统的精度和实用性至...
通过经纬度算出两点间的距离,经过仔细对比及参照,相对精确度较高,请大家放心使用
### Java实现的关键点 #### 1. 字符串处理 在Java中,可以通过`toCharArray()`方法将字符串转换为字符数组,以便逐个字符地进行处理。例如: ```java char[] chars = cnStr.toCharArray(); ``` 这里`cnStr`代表待...
Java编程调用PageOffice实现从空白的excel文件动态生成excel表格,设置公式并填充数据。 集成PageOffice不但能够实现在线编辑、保存真正的Office文档,而且还可以轻松实现Word、Excel文档的动态数据填充、格式控制和...
这些函数可以增强公式计算的复杂性。 4. **变量绑定**:在解析公式时,可以将程序中的变量绑定到公式中,使得公式能够引用程序状态。这对于基于当前数据进行计算非常方便。 5. **安全性和错误处理**:在使用`eval....
在信息论中,熵(Entropy)是一个非常重要的概念,...通过理解和应用这些知识点,你可以使用JAVA实现信息熵的计算,从而更好地分析数据的特性。这在数据压缩算法设计、编码理论以及各种信息处理场景中都具有实际价值。
总的来说,MFCC+FFT的JAVA实现涉及到信号处理、数字音频和数值计算等多个领域的知识,是语音识别系统的基础模块。开发者需要深入理解这些概念,并结合JAVA编程技术,才能构建出高效可靠的MFCC算法。
综上所述,Java实现Logistic回归涉及了数据处理、模型构建、优化算法等多个方面,需要对机器学习基础理论和Java编程有一定了解。在实际项目中,我们通常会结合现有的库来简化开发过程,并注重模型的评估和调优。
某天,突发奇想,有没有计算微积分的程序 找了半天,发现一些如 matlab 、《计算工厂》等软件, 就是没找到,能够以字符串形式输入表示式 并且能够方便JAVA调用的程序 于是花了3天做了一个