2017-08-18 27 views
1

我有這個代碼,目標是,拿一些數字,並給我另一個數字。很簡單。GWT編譯器:添加兩個數字創建一個字符串

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」和「increment」的連接。

這是GWT,所以無論我在這裏編寫的Java代碼是被編譯成JS,並且在某些時候該值被錯誤地轉換爲字符串。什麼可能導致這個?無論如何要解決它?我正在使用GWT v2.6。

承擔命名,lowValue和highValue,實際上應該分別爲1和0。

+1

你是直接從JS調用'interpolativeDoubleProperty'嗎? (即從本地JS調用,而不是GWT編譯的JS)。 – Andrei

+0

我沒有看到GWT 2.8.0的這種行爲。 '內插值= 0.8333333333333334'。你可以嘗試更新嗎?另外,請嘗試使用完整版本的輸出進行編譯,您可以看到JS已經制作完成,並且可能瞭解正在發生的事情。 – Stik

+0

我只從GWT編譯的JS中調用interpolateDoubleProperty – user3689186

回答

1

解決它:

變量lowValue最初是從正被創建和JSNI代碼管理的HTML滑塊設置字段來:

private static native double getSliderValue(String sliderID) /*-{ 
    return $doc.getElementById(sliderID).value;  
}-*/; 

編譯後,有沒有機制保障滑塊的值實際上是一個double(它實際上保存爲一個字符串!)。它最終使其成爲輸入參數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() + "'"); 
相關問題