简单的说是: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是一种强大的、轻量级的表达式语言,主要被设计用于Java应用程序,提供了一种简洁的方式来执行动态计算和访问对象属性。它以其简单易读的语法和高效的执行性能在许多项目中得到广泛应用。MVEL的2.0版本引入...
**表达式解析器(MVEL)** MVEL是一个强大的、轻量级的动态脚本语言,主要设计用于简化表达式和脚本的编写。它被广泛应用于Java应用程序中,作为一个快速的表达式语言,允许开发者在运行时进行计算和决策。MVEL支持...
本话题聚焦于Java编程艺术中的一个关键环节——表达式解析器,它允许我们处理和求值数学或逻辑表达式。在给定的“Java编程艺术-表达式解析器.rar”压缩包文件中,我们可以深入学习如何在Java中构建这样一个工具,以...
Java SpEL、OGNL(Object-Graph Navigation Language)和MVEL是三种常见的表达式语言,它们在Java开发中被广泛用于动态逻辑的处理和对象属性的访问。在本项目中,我们将深入探讨这三个表达式语言的用法以及如何在...
MVEL表达式的例子如`foo.name == "Mr. Foo"`,这个表达式检查`foo.name`的值是否等于字符串"Mr. Foo"。这里的`foo`可以是以下两种情况之一: 1. **Context对象**的属性:你可以创建一个Context对象,让MVEL根据这个...
MVEL 2.0 支持多种类型的表达式,包括但不限于属性表达式、布尔表达式、方法调用、变量赋值以及函数定义。这些表达式构成了 MVEL 的基础,并允许用户构建复杂的逻辑结构。 ##### 2.1 基本语法 MVEL 是一种动态类型...
C++后缀表达式转前缀表达式 C++程序中,后缀表达式转换为前缀表达式是一种常见的操作。为了完成这个操作,我们需要使用栈数据结构来存储和处理表达式中的操作符和操作数。 首先,让我们了解一下什么是后缀表达式和...
2. 遇到数字时,将其作为后缀表达式的输出。 3. 遇到运算符时,将其与栈顶运算符比较。如果栈顶运算符优先级更高或相等,将栈顶运算符弹出并输出,直到找到优先级更低的运算符或栈为空。然后将当前运算符压入栈中。 ...
这通常涉及到创建一个运算符栈,遍历中缀表达式,遇到数字时将其添加到输出队列,遇到运算符时与栈顶运算符比较优先级,根据优先级决定是否入栈或输出。 2. **运算符优先级**:理解并定义每个运算符的优先级是至关...
计算时按照“从左至右扫描”的方法,遇到数字则压栈,遇到运算符则弹出栈顶的两个数,执行运算后将结果再次压栈,直至完成整个表达式的求值。 在将中缀表达式转换为前缀或后缀表达式时,通常需要遵循运算符优先级,...
遍历后缀表达式,遇到数字时入栈;遇到运算符时,弹出栈顶两个元素进行运算,将结果压回栈中。最后,栈顶元素即为表达式的结果。 4. **C++编程技巧**: - **字符串处理**:可以使用C++标准库中的`std::string`来...
5. `calcolate` 函数计算后缀表达式的值,同样利用栈,遇到数字压栈,遇到运算符则弹出栈顶两个操作数进行计算,结果再入栈,最后栈顶元素即为表达式的结果。 模块调用关系如下: - 主程序模块调用结构体创建、非法...
在计算机科学领域,表达式求值是编程中的一个重要概念,特别是在数据结构和算法设计中。后缀表达式,又称逆波兰表示法,是一种方便计算的表达式表示方式,它消除了括号的使用,通过将操作符放置在操作数之后来简化...