2012-06-18 21 views
0

我製作了一個數組,用於存放表示小型2D遊戲瓷磚的簡單值(1,1,2,1 ...)。AS3:減法不精確

我想股票的旋轉(和額外的)參數數組中,所以我說小數到我的價值觀: 1.45,1.90,2.0,1.90 ... 例如,1.45意味着我想要一個草磚(1)旋轉45°。

以 「解析」 我的小數,我做的:

arr[0] = 2.9; 
rot = arr[0] - Math.floor(arr[0]); 

我應該得到0.9,但我得到0.89999代替。

任何想法爲什麼這個簡單的AS3減法不正確?或者,也許我應該創建另一個陣列來儲存這些「額外」參數?

感謝您的指示燈

回答

0

Actionscript使用浮點數。許多小數不能完全表示。

你可以使用另一個數組來處理額外的參數,或者將你的值乘以一些靜態值...比如1,000?這會把額外的參數移到整個單位。 1000可以讓你放置任何0-359°的值。雖然您必須執行額外的解析來評估減法或加法的進位。

也許另一個陣列將是最好的... :)

0

你減去Number對象,在AS3的浮點運算。浮點數固有地具有準確性問題。 Here是解釋爲什麼。

你的最簡單方法是圓你的答案:

var arr:Array = []; 
arr[0] = 2.9; 
var rot:Number = Number(arr[0]) - Math.floor(arr[0]); 
var rounded:Number = Number(rot.toFixed(1)); 
3

這是floating point numbers的固有問題。您可以使用rot = rot.toFixed(2)round the number設置爲給定的小數位數,或者您可以忽略這些微小的差異 - 它們需要大量加起來。

另外,您可以使用rot = arr[0] % 1來獲取小數點後的部分。

使用小數存儲旋轉值似乎並不理想,尤其是因爲您的方式只允許旋轉達100度。另外,如果你想存儲比瓦片類型和旋轉更多的值呢?使用多個數組(甚至可以是一個自定義類的對象數組)可能是最好的。

+0

您還可以創建一個自定義類「Tile」,它具有「Rotation」屬性以及草,石頭,路面,地毯等的子類。 – CarlF

+0

我可以建議,除了鏈接到文檔之外,您實際上添加一個'toFixed'的例子?如果文檔要停下來或移動,那麼這個答案將不再是答案。 – redhotvengeance

+0

類可能是一個好主意@CarlF,但我不太確定每個tile類型的子類是否是正確的方法。這可能是很多不必要的開銷,取決於遊戲的運作方式。 – CheeseWarlock