我有这个代码,目标是,拿一些数字,并给我另一个数字。很容易。
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.16666666666666666
它告诉我" toReturn"正在被视为一个字符串,它的值等于" lowValue"的串联。和"增加"。
这是GWT,所以无论我在这里编写的Java代码是否都被编译成JS,并且在某些时候,该值被错误地转换为字符串。可能是什么导致了这个?无论如何要解决它?我正在使用GWT v2.6。
承担命名,lowValue和highValue,实际上分别为1和0。
答案 0 :(得分:2)
解决了它:
变量 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() + "'");