展开全部
//MathX.java
//表达式计算程序,绝对62616964757a686964616fe4b893e5b19e31333238643066原创,
//与网上多数介绍的方法思路有点不同,
//与采用直接调用js的方法有根本的不同,
//支持 加 减 乘 除 幂 及 开方 运算,支持多级括号,
//本程序在 JDK1.6_11下开发,低版本JDK兼容性未测试,
import java.text.DecimalFormat;
public class MathX {
public static void main(String[] args) {
String str = "83-32+83*32/4+3";
double d = Calc.doCalc(str).getValue();
System.out.println(Calc.getStr()+"="+d);
}
// public static double calc(String s){
// return Calc.doCalc(s).getValue();
// }
// public static String getStr(){
// return Calc.getStr();
// }
// public static String getFormatted() {
// return Calc.getFormatted();
// }
}
class Calc{
private static final DecimalFormat df = new DecimalFormat("0.000000");
private static CalcCore co;
private static NumberWrapper result;
public static NumberWrapper doCalc(String exp){
co = new CalcCore(exp);
result = co.getResult();
return result;
}
public static String getFormatted() {
return df.format(result.getValue());
}
public static String getStr(){return co.toString();}
}
//数据外覆类
class NumberWrapper{
public static final int IaN = 0;
public static final int NaN = 1;
public static final NumberWrapper NOTHING = new NumberWrapper(Double.NaN,NumberWrapper.NaN);
private double value;
private int id;
public NumberWrapper(double v){
this(v,NumberWrapper.IaN);
}
public double getValue(){
return id==NumberWrapper.IaN?value:Double.NaN;
}
public NumberWrapper(double v,int id){
this.value=v;
this.id=id;
}
// +-*/^~
public NumberWrapper calc(NumberWrapper x,char o){
if(this.NaN()||x.NaN())
return NumberWrapper.NOTHING;
return new NumberWrapper(calc(this.getValue(),x.getValue(),o));
}
private double calc(double a,double b,char o){
try{
switch(o){
case OStack.PLUS:return a+b;
case OStack.SUBTRACT:return a-b;