- JavaDoc

# JEP

- Introduction
- Basic Usage
- Variables
- Data types
- Operators
- Functions
- Custom Functions
- BigDecimal
- FAQ
- Migration
- Version History

# Advanced Features

- Manipulating Expressions
- Components
- Configurable Parser
- Serialization
- Grammar

# Frequently Asked Questions

## Q: I've noticed that Jep does not give accurate results for certain expressions. Why is this? What can I do about it?

> A: You will notice that when you evaluate something as simple as "8 - 7.9" the result will be 0.09999999999999964 rather than 0.1. These inaccuracies are the result of floating point arithmetic. Internally, Jep uses the `double` type to represent numbers by default. Unfortunately, even for trivial calculations such as "8 - 7.9" the calculation can not be performed accurately.

> You will notice the same if you run the following code.

>     double a=8, b=7.9;
>     System.out.println("a-b = " + (a-b));
>     //prints a-b = 0.09999999999999964

> So this is not a Jep flaw, just a limitation of using floating point numbers. Although floating point numbers are accurate enough for many applications, these types of errors should not be ignored in applications where accuracy is critical.

> By using System.out.printf results from Jep can be displayed to a given number of decimal places. For example

>     jep.parse("8-7.9");
>     double res = jep.evaluateD();
>     System.out.printf("%.3f",res);

> Which will print the result to three decimal places: 0.100. See java.util.Formatter for details on formatting output. The java.text.NumberFormat class can also be used to format results.

> Jep has a round function, which can round arguments to a given number of decimal places. `round(8-7.9,1)` will round results to one decimal place.

> To avoid this problem, use the BigDecimal components as described in the BigDecimal section. They allow you to perform calculations with arbitrary accuracy unlike floating point arithmetic.

## Q: Jep is throwing com.singularsys.jep.EvaluationException: Could not evaluate XXX : no value set for the variable.

A: By default variables who values have not been set by either

    jep.addVariable(name,value);

or by parsing a expression like

    XXX = 123.456;

will have a null value. By default the evaluator will throw an exception when null values are encountered.

There are a couple of ways round this:

1. You can turn off the check for null values using

       ((StandardEvaluator)jep.getEvaluator()).setTrapNullValues(false);

2. You can change the default value used for unassigned values

       jep.getVariableFactory().setDefaultValue(Double.valueOf(0.0));