我正在使用第三方库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
类型一起使用的类似库?
答案 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