Как избежать потери точности при использовании jeval? - PullRequest
0 голосов
/ 13 марта 2019

Я использовал 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 Ответ

1 голос
/ 13 марта 2019

Согласно Javadoc от Jeval для метода evaluate(String expression) для Jeval 0.9.4, в нем говорится:

"Результат вычисленного выражения. Числа рассматриваются как удваивается, поэтому результирующие числа будут содержать хотя бы один десятичный знак место. "

Вы не можете избежать потери точности при использовании удвоений. Смотрите это . Числа с плавающей точкой имеют эти ограничения. Например, вы можете увидеть это для простых выражений типа 5.6 + 5.8, что приводит к 11.399999999999.

...