简单的说是:mvel中int和一个double做乘法,是可能出问题的
public static void main(String[] args) throws Exception {
System.err.println(1350*0.7*(0.97+0.5*0.06));
String exp3="a*b*(c+d*e)";
Map<String, Object> map=new HashMap<>();
map.put("a", 1350d);
map.put("b", 0.7);
map.put("c", 0.97);
map.put("d", 0.5);
map.put("e", 0.06);
Serializable exp4 = MVEL.compileExpression(exp3);
System.err.println( MVEL.executeExpression(exp4, map, Double.class));
}
这个都很正常,结果是:
944.9999999999999
944.9999999999999
但是稍微改一下,把a的值变为int
public static void main(String[] args) throws Exception {
System.err.println(1350*0.7*(0.97+0.5*0.06));
String exp3="a*b*(c+d*e)";
Map<String, Object> map=new HashMap<>();
map.put("a", 1350); //注意这里的a是int
map.put("b", 0.7);
map.put("c", 0.97);
map.put("d", 0.5);
map.put("e", 0.06);
Serializable exp4 = MVEL.compileExpression(exp3);
System.err.println( MVEL.executeExpression(exp4, map, Double.class));
}
结果变为:
944.9999999999999
945.0
这个时候就不是我们想要的结果了。
具体原因不是很清楚,但是我们目前的解决方法是:
把表达式中的int转为double 。做法很简单,int乘以1.0
上面的表达式变为: String exp3="1.0*a*b*(c+d*e)";
分享到:
相关推荐
MVEL 2.0表达式语言MVEL 2.0表达式语言MVEL 2.0表达式语言
NULL 博文链接:https://yanguz123.iteye.com/blog/2146176
数值表达式,可执行算术运算公式。 例如:(100 – 5) * 14/6 <br/>
mvel2.0语法指南,MVEL通常用于执行用户(程序员)通过配置XML文件或注释等定义的基本逻辑。它也可以用来解析简单的JavaBean表达式。Runtime(运行时)允许MVEL表达式通过解释执行或者预编译生成字节码后执行。
telb.zip,使用ognl或mvel表达式作为组件/页参数值。tapestry5表达式语言绑定-使用ognl或mvel表达式作为组件/页参数值
java实战
表达式解析表达式解析表达式解析表达式解析表达式解析表达式解析
正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式
el 表达式el 表达式el 表达式el 表达式el 表达式
正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式正则表达式
ognl表达式 ognl表达式 ognl表达式 ognl表达式
正则表达式,正则表达式,正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式
表达式表达式解析器表达式解析器表达式解析器表达式解析器表达式解析器
常用正则表达式 正则表达式 常用正则表达式 正则表达式
相信大家对正则表达式一定都有所了解和研究,这篇文章主要为大家分享了Java 表单注册常用正则表达式验证工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
java版的等式表达式解析,不等式表达式解析,与或非逻辑运算表达式解析;支持带参数的表达式解析; 支持带函数的表达式解析。 1、支持 +、-、*、/、%、&&、||、!、>、<、>=、、==、!=、^(幂)、(、) 运算符 2、支持有...
逗号表达式(表达式1,表达式2….)逗号表达式最右边的值为逗号表达式的值.one