java - 带有 BigDecimal 的 JEP 库

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

Result: 28987.0300000002

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

最佳答案

首先修复:

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();
    }

关于java - 带有 BigDecimal 的 JEP 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296639/

相关文章:

java - hql 查询将数据保留在具有多对一关系的表中

java - 使用流将多个 HashMap 的内容相加

java - BigDecimal 向下取整出错

java - 不支持使用 JPA 更新查询的 DML 操作

java - Intellij 代码完成,显示方法/构造函数参数类型和变量名称

java - 从 java BigDecimal 转换为 double 时丢失精度

java - Java BBP公式中PI的百万元素

ruby - 在不使用 BigDecimal 的情况下将美分转换为 Ruby 中的美元字符串

java - 如何在某些子句上禁用 JButton?

java - 使用 Spring AOP 触发了哪个接口(interface)(扩展 CrudRepository)的删除方法?