Почему JEXL Calc арифметика неправильно
Я использую библиотеку JEXL для вычисления математического выражения с различными аргументами (например, y=2x+a^2-4*a*x, где (x=1&a=3), (x=5&a=-15) и т. Д.). Это хорошо работает с простыми выражениями, но когда я начинаю использовать более сложные выражения - это не работает. Вот код, работающий хорошо:
JexlEngine jexl = new JexlEngine();
Expression func = jexl.createExpression("x1+x2");
MapContext mc = new MapContext();
mc.set("x1", 2);
mc.set("x2", 1);
System.out.println(func.evaluate(mc)); // prints "3" - GOOD ANSWER!
но этот один печатать неправильный ответ:
JexlEngine jexl = new JexlEngine();
Expression func = jexl.createExpression("(x1-2)^4+(x1-2*x2)^2");
MapContext mc = new MapContext();
mc.set("x1", 2);
mc.set("x2", 1);
System.out.println(func.evaluate(mc)); // prints "6" - WRONG ANSWER!
Что я делаю не так?
2 ответа
Решение
^
является побитовым xor, поэтому 6 - ожидаемый ответ. Смотрите синтаксис JEXL для деталей.
Вы можете сделать что-то подобное:
Map<String, Object> functions=new HashMap<String, Object>();
// creating namespace for function eg. 'math' will be treated as Math.class
functions.put( "math",Math.class);
JexlEngine jexl = new JexlEngine();
//setting custom functions
jexl.setFunctions( functions);
// in expression 'pow' is a function name from 'math' wich is Math.class
Expression expression = jexl.createExpression( "math:pow(2,3)" );
expression.evaluate(new MapContext());