如何在使用jeval时避免准确性损失?

时间:2019-03-13 11:00:03

标签: java bigdecimal

我将jeval用于某些数据计算任务,但发现准确性下降。 有什么方法可以避免在使用jeval时造成精度损失? 我想得到像BigDecimal一样的准确结果。

public class EvalTest {

    private static Evaluator eva = new Evaluator();

    public static void main(String[] args) {

        try {
            String formula = "780.0000000-259.9999998";
            String res = eva.evaluate(formula);

            BigDecimal a = BigDecimal.valueOf(780.0000000);
            BigDecimal b = BigDecimal.valueOf(259.9999998);
            BigDecimal c = a.subtract(b);

            System.out.println("a");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果使用jeval,则公式“ 780.0000000-259.9999998”的结果将为“ 520.0000001999999”,但是如果使用BigDecimal,则可以获得的精度结果为“ 520.0000002”。

1 个答案:

答案 0 :(得分:1)

根据Jeval的Javadoc的Jeval 0.9.4的evaluate(String expression)方法,它说:

  

“求值表达式的结果。数字被视为   加倍,因此结果数字将至少包含一个小数   的地方。”

使用double不能避免精度损失。参见this。 浮点数具有此限制。例如,您可以在5.6 + 5.8之类的简单表达式中看到它,其结果为11.399999999999