簡體   English   中英

AS3 - 為什么將DisplayObject的alpha設置為0.7實際上會導致alpha設置為0.69921875?

[英]AS3 - Why does setting a DisplayObject's alpha to 0.7 actually results in the alpha being set to 0.69921875?

在我的代碼中的某一點,我將Sprite的alpha設置為0.7

square.alpha = 0.7;

稍后在我的代碼中,我在條件語句中檢查這個alpha。

if (square.alpha == 0.7) {//do stuff}

直到我做了一個trace(square.alpha);我才開始摸不着頭腦trace(square.alpha); 而不是0.7我得到了0.69921875

這個數字( 0.69921875 )對於我設置為alpha為0.7的精靈的每個實例是相同的。

我做了一些測試,它看起來像唯一值alpha返回正是我將它們設置為相同值00.51 其他任何東西似乎總是返回一個非常接近我設定的數字,但不完全。 例如0.2將給我0.19921875

為什么會這樣?

我使用Flex編譯代碼,不確定這是否對此有任何影響。

Alpha存儲為引擎蓋下的8位通道。 這個數字是由於float - > 8位int - > float轉換引起的。

這是數學:

256 * 0.7 = 179 (179.2 rounded) // converting from float to 8bit int
179 / 256 = 0.69921875          // converting from int back to float

這不是由於其他人建議的浮點數限制。

0,0.5和1正確工作的原因是這些是在轉換為8位int時不經歷任何舍入的分數。

例如:

256 * 0.5 = 128 (no rounding necessary)
128 / 256 = 0.5

如果你想要一個解決方法,你可以將你的alpha設置為256分,並檢查相同的分數:

square.alpha = 179 / 256;

if (square.alpha == 179 / 256) {/*do stuff*/}

這是浮點數的一般限制。 正如你無法在十進制系統中精確表達1/30.33333333....等),你不能將(十進制) 0.1為二進制浮點數( 0.00011001100110011001100110011...等)。

可以將十進制0.5精確表示為二進制浮點數( 0.1 ),以及0.250.01 )和分母中冪為2的其他分數。 這就是為什么你看到0.5的正確結果,而不是其他人的結果。

這部分Python文檔很好地解釋了它。

這不是關於alpha ...它是關於浮點運算。 計算機存儲浮點數的方式,某些數字往往接近您想要存儲的數字。 您可以在此問題中找到更多詳細信息: 為什么我在ECMAScript / ActionScript 3中看到不精確的浮點結果?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM