如何解析代数式,只有+ - * / (),标准4则运算,java有么有现成的解析方法啊,非要用编译原理的算法才行吗(早忘光了),我现在的需求是,让Bigdecmal 对象可以像int,double一样 使用+ - * / ()进行运算

解决方案 »

  1.   

    解析数学表达式还真的比较困难呢。如果你有时间又有兴趣的话,看看beanshell或Javacc
      

  2.   

    我刚才又帮你想了想。想到了2个方案。
    1.用"+-*/"分割字符串。然后判断每个是不是数值型的。这个错法对正确书写符号的是可以的。但是不能检测出多了一个大括号这类的。
    2.用MVEL看看字符串能不能算出值。能算出来就说明没错,否则说明不符合四则运算。MVEL你可以理解成Javascript中的EVAL。
    代码如下:
    public boolean validated(String str) {
    boolean validated = true;
    if(str!=null){
    String[] splits = StringUtils.split(str, "+-*/()");
    for(String split : splits) {
    if(!StringUtils.isNumeric(split)){
    validated = false;
    break;
    }
    }
    }
    return validated;
    }

    public boolean validated2(String str) {
    if(str!=null){
    try{
        MVEL.eval(str);
        return true;
    }catch(Exception e){
    return false;
    }
    }
    return false;
    }

    public static void main(String[] args) {
    String str = "(12+234)*23/23-234";
    ZhengzeTest test = new ZhengzeTest();
    System.out.println(test.validated(str));
    System.out.println(test.validated2(str));
    }
      

  3.   

    答:真的很简单啊。请楼主准确地说明清楚需求,就能很方便地写出来(不仅能准确运算,而且不能准确错与定位)。如:Bigdecmal准确度达到多少位(如:128位的十进制位?32位的十进制数位?等等)
      

  4.   


    谢谢大家啊,通过数字,判断倒是不错,其实一共有两个需求,
    第一,由于一直使用double类型进行的计算,导致不够精确,由于计算式太多,唯一共同的方法的,计算后的结果都会通过一个round(double v,int position)方法,进行四舍五入,所以希望在这个round方法里,校正double的计算错误,(我认为正确率很低)第二,是否能实现BigDecimal类型的,利用+-*/号的四则运算,如果不能,完成这个方法 calculate(String 计算式,Map 替换计算式中的key)
    我很伤心,,,伤心中
      

  5.   

    我晕啊。用Double这种双精度的类型都不精确,请问你计算什么啊?
      

  6.   

    用逆波兰算法吧,也就是你说的“编译原理的算法”。如果忘了的话,可以搜索一下“逆波兰”,或者看看下面这个网页:http://www.bugcode.com/diary/28510819