带有 BigDecimal 的 JEP 库

JEP library with BigDecimal

我正在使用第三方库org.nfunk.jep。所有计算都在库中的 double 中,无论输入变量的类型如何。所以当下一个代码执行时:

BigDecimal value1 = new BigDecimal("29250.24");
BigDecimal value2 = new BigDecimal("263.21");
JEP calc = new JEP();
calc.addVariable("var1", Double.parseDouble(value1));
calc.addVariable("var2", Double.parseDouble(value2));
calc.parseExpression("var1 - var2");
System.out.println("Result: " + calc.getValue());

我想要像“28987.03”这样的结果,但我得到这样的结果:

Result: 28987.0300000002

也许有人知道如何在 BigDecimal 中使用此库或知道一些可与 BigDecimal 类型一起使用的类似库?

您可以尝试像这样格式化数字:

        NumberFormat numberFormat = new DecimalFormat("#0.00");
        System.out.println(numberFormat.format(calc.getValue()));

因为 calc.getValue() 是一个双精度值,这将始终将其格式化为小数点后两位。

我不知道你使用 JEP 的用例是什么,但是 BigDecimal 可以直接处理简单的减法。

        BigDecimal value1 = new BigDecimal("29250.24");
        BigDecimal value2 = new BigDecimal("263.21");
        System.out.println(value1.subtract(value2)); //28987.03

您可以阅读更多相关信息BigDecimal#subtract

首先修复:

BigDecimal result = new BigDecimal(calc.getValue()).setScale(value1.getScale());

可以将生成的双精度值再次放入 BigDecimal 中。特例:乘法的比例是两个因子的比例之和 (0.1 * 0.1 = 0.01).

解决方案:

使用Java Scripting API。它适用于多种语言,但 Java SE 提供了一个 JavaScript 脚本,可能就足够了。

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("nashorn");

    engine.put("var1", new BigDecimal("3.14"));

    try {
        engine.eval("print(var1.multiply(var1))");
        BigDecimal x = (BigDecimal) engine.eval("var1.multiply(var1)");
        double y = (Double) engine.eval("var1 * var1");
    } catch (ScriptException e) {
        e.printStackTrace();
    }