2013-09-27 39 views
1

所以長話短說,我已經花了近2-3天的麻煩時,我實現了一個新的窗口,調整偵聽器出現我的圖形計算器拍攝的錯誤。這個錯誤是當我慢慢調整窗口大小時,函數不能正確地轉換,如果我快速移動它們,它們會轉換得很好。我查看了我所有的公式和算法,並且所有的東西都是現成的(與之前的窗口調整方法相同)。每當寬度發生變化時,我會將其差異改爲2,然後將圖表移動該數量。真的很簡單。何時需要進行類型轉換?

double changeX = (newCanvasWidth - canvasWidth)/2; 

double changeY = (newCanvasHeight - canvasHeight)/2; 

這已經工作得很好,並且所有的邏輯意義,我需要無視這個的罪魁禍首了近3天。它是如此的天真,我幾乎改寫了我的整個程序,試圖解決這個問題,從補償算法對所有新的方法來預測這些錯誤並修復它們。這變成了一場噩夢,令人難以置信的煩人。放棄完全的希望之前,我決定用與此相關的每一個計算的全面跟蹤,並輸出這些計算的結果再次探討這個問題,我發現一個奇怪的現象。每當(newCanvasWidth - canvasWidth)之間的差異是奇怪的,我沒有得到整數末尾的一半。

所以,如果它們之間的區別是說15,changeX將反映7.最令人不安的是,當差值爲1,changeX將爲0

在發現這當然我嘗試了明顯的事情和鑄造型減法。

double changeX = (double)(newCanvasWidth - canvasWidth)/2; 

double changeY = (double)(newCanvasHeight - canvasHeight)/2; 

而你看,我的問題解決了!

我不明白,雖然是爲什麼這並不會自動發生。此外,如果這只是我將不得不在限制的所有時間進行調整的東西?無論如何要知道你什麼時候需要輸入像這樣的簡單計算嗎?

+5

這是'/ 2'。你想要'/ 2.0'。 – pamphlet

+0

而不是投射,我相信如果你把'2'改成'2.0',它應該也能很好地工作。 – nhgrif

+0

是什麼類型newCanvasWidth,canvasWidth,newCanvasHeight和canvasHeight – justadeveloper

回答

2

它不是自動發生,因爲在右手側上的分配的(右軸),即(newCanvasHeight - canvasHeight)/2計算髮生作爲一個單獨的操作分配給changeY之前。由於在RHS所有條款都是整數,結果與截斷小數部分(不四捨五入),然後將其存儲爲雙(所以不是7.57,被存儲爲7.0)的整數。既然你在RHS上使用了一個常數項,你可以使它成爲一個double(就像@Clown建議的那樣),從而在計算結果存儲之前使其計算結果加倍。如果RHS的所有術語都是變量,那麼你會投。

所以,是的,有一種方法可以知道什麼時候需要投入(或以其他方式轉換):如果任務的RHS的最精確的術語不如LHS精確。

1

因爲newCanvasWidthcanvasWidth被聲明爲int的你不會自動得到一個十進制結果時,除以另一個整數。如果你不想投你應該已經使用2.0。 Java中的整數除法總是丟棄小數,除非另有說明。

+0

我可以安全地假設,儘管真正的答案是,int/int返回一個int和int/double返回一個double,當然double/int也返回一個double? – rfoo

+0

是的,這是正確的 – Andreas

+1

@rosscowar:值得一提的是業務涉及整數類型,'float'將產生'float',即使結果不能準確地'float'表示,但可以在'double'準確地代表。例如,33554434/2.0將生成16777217.0(類型'double'),但33554434/2.0f將生成16777216.0f(類型'float');編譯器不會警告後續的精度損失。 – supercat

4

Java不自動擴展積分表達式浮點,因爲它是非常昂貴的計算這樣做,因爲你可能會失去精度。是的,如果你有一個整數值,你想分成一個非積分商,你總是需要告訴Java(和C/C++)。 Java語言規範有comprehensive rules關於數學表達式是什麼類型的值。

使用數字文字時,這樣是爲了使文字浮點類型的快捷方式:

double changeX = (newCanvasWidth - canvasWidth)/2.0; 
+2

當你已經用'2.0'劃分時,你真的需要投射嗎? – Andreas

+1

@ClownOfTheJungle Copypasta。你有代表,所以隨意編輯這樣的明顯的大腦屁! – chrylis

+0

好吧,這是非常讓人大開眼界,甚至讓我感到震驚的是,我在這個項目中走到了這一步,直到現在還沒有注意到這個錯誤。謝謝。 – rfoo

0

若結果的使用除法時成爲一個十進制數,例如一個機會,你應該始終確保結果是雙倍的。在這裏你會在必要時施放。但一般來說,您使用類型在不同環境下,比如去從Object別的東西,或作爲一個更好的例子,在Android中從View去一個TextView時,更多的時候鑄造了很多。