【发布时间】:2017-05-29 23:12:02
【问题描述】:
我正在尝试制作一种采用字符串公式的方法,并通过以非常小的间隔进行黎曼和来求解该公式的积分。我正在使用 ScriptEngine 和 ScriptEngineManager 类来评估函数(使用 eval() 方法)。出于某种原因,我收到此错误:
线程“main”java.lang.ClassCastException 中的异常:java.lang.Integer 无法转换为 java.lang.Double 在 sum.integral(sum.java:31) 在 sum.main(sum.java:13)
import java.beans.Expression;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class sum {
//testing method
public static void main(String[] args) throws ScriptException {
double x = integral("5*x^2",0,5);
System.out.println(x);
}
public static double integral(String function, double lower, double upper) throws ScriptException
{
double total = 0;
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
//Solves function from upper to lower with a .001 interval, adding it to the total.
for (double i = lower; i < upper; i+=.001)
{
//evaluates the interval
engine.put("x",i);
total += (double)engine.eval(function);
}
return total;
}
}
【问题讨论】:
-
值得注意的是,
for (double i = lower; i < upper; i += .001)会累积错误,因为0.001不能完全用浮点表示。 What Every Computer Scientist Should Know About Floating-Point Arithmetic(这可能会也可能不会影响您结果的准确性;我不确定。) -
我无法想象为什么有人会否决这个问题。 Erik 提供了他的代码、他遇到的问题以及他收到的准确错误消息。 SO 用户还可以在问题中提出什么要求?
标签: java function eval scriptmanager integral