带有BigDecimal的JEP库

时间:2016-05-18 10:17:06

标签: java 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"的结果,但我得到了这样的结果:

  

结果:28987.0300000002

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

2 个答案:

答案 0 :(得分:2)

首先修理:

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

可以使用生成的double并再次将其放在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();
    }

答案 1 :(得分:1)

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

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

由于calc.getValue()是一个double值,因此总是将其格式化为2位小数。

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

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

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