解决mvel算数运算时精度失真问题。
当我们采用mvel实现算数运算时可能会出现精度失真问题。如:
@Test
public void testMvel() {
String expression = "def calc() { return currentRate-historyRate; } return calc();";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("currentRate", 0.01800000);
paramMap.put("historyRate", 0.01600000);
Object object = MVEL.eval(expression, paramMap);
System.out.println("输出结果:" + object);
}
此时得到的结果精度将失真:
输出结果:0.0019999999999999983
解决这个问题我们可以利用mvel的占位符@{}
及指定数据类型B
,B
即BigDecimal
的缩写。如:
@Test
public void testMvel() {
String expression = "def calc() { return (@{currentRate}B-@{historyRate}B); } return calc();";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("currentRate", 0.01800000);
paramMap.put("historyRate", 0.01600000);
/**匹配表达式*/
expression = (String) TemplateRuntime.eval(expression, paramMap);
Object object = MVEL.eval(expression, paramMap);
System.out.println("输出结果:" + object);
}
此时得到的结果:
输出结果:0.002