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,看看它在干什么。