解决mvel算数运算时精度失真问题

解决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的占位符@{}及指定数据类型BBBigDecimal的缩写。如:

@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

猜你喜欢

转载自blog.csdn.net/wangchengaihuiming/article/details/86594616