Почему JEXL Calc арифметика неправильно - PullRequest
3 голосов
/ 27 ноября 2011

Я использую библиотеку 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 ]

5 голосов
/ 20 мая 2013

Вы можете сделать что-то подобное:

   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());
3 голосов
/ 27 ноября 2011

^ - побитовая xor, поэтому 6 - ожидаемый ответ.Подробнее см. Синтаксис JEXL .

...