我正在使用第三方库 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/