带有 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();
}
我正在使用第三方库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();
}