如何解析代数式,只有+ - * / (),标准4则运算 如何解析代数式,只有+ - * / (),标准4则运算,java有么有现成的解析方法啊,非要用编译原理的算法才行吗(早忘光了),我现在的需求是,让Bigdecmal 对象可以像int,double一样 使用+ - * / ()进行运算 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 解析数学表达式还真的比较困难呢。如果你有时间又有兴趣的话,看看beanshell或Javacc 我刚才又帮你想了想。想到了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)); } 答:真的很简单啊。请楼主准确地说明清楚需求,就能很方便地写出来(不仅能准确运算,而且不能准确错与定位)。如:Bigdecmal准确度达到多少位(如:128位的十进制位?32位的十进制数位?等等) 谢谢大家啊,通过数字,判断倒是不错,其实一共有两个需求,第一,由于一直使用double类型进行的计算,导致不够精确,由于计算式太多,唯一共同的方法的,计算后的结果都会通过一个round(double v,int position)方法,进行四舍五入,所以希望在这个round方法里,校正double的计算错误,(我认为正确率很低)第二,是否能实现BigDecimal类型的,利用+-*/号的四则运算,如果不能,完成这个方法 calculate(String 计算式,Map 替换计算式中的key)我很伤心,,,伤心中 我晕啊。用Double这种双精度的类型都不精确,请问你计算什么啊? 用逆波兰算法吧,也就是你说的“编译原理的算法”。如果忘了的话,可以搜索一下“逆波兰”,或者看看下面这个网页:http://www.bugcode.com/diary/28510819 如何有选择地生成xml? 我提一个关于擦除的简单问题。 请写出下面代码的输出结果 在JFrame中怎么得到 Graphics的对象 请教:类的包访问权限问题 求平均值 这是文件过滤的类,怎么实现象DOS里面通配符号。 请问如何接受JTextField的整型数据??? 初来贵地,问一个巨弱的问题!!在线等待!! 有关JavaSE的问题 求一触发器(急) 问下tab键对应的字符是什么?
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));
}
谢谢大家啊,通过数字,判断倒是不错,其实一共有两个需求,
第一,由于一直使用double类型进行的计算,导致不够精确,由于计算式太多,唯一共同的方法的,计算后的结果都会通过一个round(double v,int position)方法,进行四舍五入,所以希望在这个round方法里,校正double的计算错误,(我认为正确率很低)第二,是否能实现BigDecimal类型的,利用+-*/号的四则运算,如果不能,完成这个方法 calculate(String 计算式,Map 替换计算式中的key)
我很伤心,,,伤心中