Javascript GWT编译器:添加两个数字就是创建一个字符串
我有这个密码,目标是,取一些数字,再给我一个数字。很简单Javascript GWT编译器:添加两个数字就是创建一个字符串,javascript,java,gwt,Javascript,Java,Gwt,我有这个密码,目标是,取一些数字,再给我一个数字。很简单 private final int height = 5; private double interpolateDoubleProperty( int heightAtLower, int heightAtHigher, //4, 10 double lowValue, double highValue) //1, 0 { double lowToHighDelta =
private final int height = 5;
private double interpolateDoubleProperty(
int heightAtLower, int heightAtHigher, //4, 10
double lowValue, double highValue) //1, 0
{
double lowToHighDelta = heightAtHigher - heightAtLower; // 6 = 10 - 4
double lowToThisDelta = (double)this.height - heightAtLower; // 1 = 5 - 4
double lerpRatio = lowToThisDelta / lowToHighDelta; // 0.17 = 1 / 6
double valueDelta = highValue - lowValue; // -1 = 0 - 1
double increment = lerpRatio * valueDelta; // -0.17 = 0.17 * -1
double toReturn = lowValue + increment; // 0.83 = 1 + -0.17
GWT.log("interpolated value = " + toReturn);
return toReturn;
}
但是,我得到的返回值不好。对于这种情况(请参见输入值注释),GWT日志输出为:
插值=1-0.16666
这告诉我“toReturn”被视为一个字符串,它的值等于“lowValue”和“increment”的串联
这是GWT,所以我在这里编写的任何Java代码都被编译成JS,并且在某个点上,值被错误地转换成字符串。这可能是什么原因造成的?怎么解决呢?我正在使用GWT v2.6
请注意命名、lowValue和highValue,实际上应该分别为1和0。解决了这个问题:
变量lowValue最初来自一个字段,该字段由使用JSNI代码创建和管理的HTML滑块设置:
private static native double getSliderValue(String sliderID) /*-{
return $doc.getElementById(sliderID).value;
}-*/;
编译后,无法保证滑块的值实际上是双精度的(它实际上保存为字符串!)。它最终进入了interpolateDoubleProperty输入参数,并打破了它添加到的任何变量
要解决这个问题,我们只需要将值字段乘以1.0,稍微“清理”一下
private static native double getSliderValue(String sliderID) /*-{
return $doc.getElementById(sliderID).value * 1.0;
}-*/;
这段代码帮助我在编译后跟踪到了运行时变量的实际类型,最终使我回到了滑块
GWT.log("Value: '" + variableToTest + "' is actually type: '" + ((Object)variableToTest).getClass().getName() + "'");
您是否直接从JS调用
interpolateDoubleProperty
?(即从本机JS调用,而不是从GWT编译的JS调用)。我在GWT2.8.0中没有看到这种行为<代码>插值=0.8333334。你能试着更新一下吗?另外,试着用完整漂亮的输出版本进行编译,你可以看到JS是如何产生的,也许可以理解这种情况。我只从GWT调用interpolateDoubleProperty编译JSUpdate在短期内不是一个选项(有团队的大型项目)。我会看看漂亮的输出。我刚刚试过GWT2.6.0,但恐怕我还是看不出问题所在。尝试在浏览器的调试器中跟踪JS,看看它在干什么。