2013-05-27 84 views
2

在我的代碼一點我設置一個Sprite的alpha 0.7AS3 - 爲什麼將DisplayObject的alpha設置爲0.7實際上會導致alpha設置爲0.69921875?

square.alpha = 0.7;

在我的代碼之後,我檢查這個字母在條件語句。

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

我抓我的頭爲什麼它不工作,直到我做和的trace(square.alpha);,而不是0.70.69921875

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

我做了一些測試,它看起來像只返回我將它們設置爲00.5,並1相同值的alpha唯一值。其他任何東西似乎都會返回一個非常接近我設置的數字,但不完全。例如0.2會給我0.19921875

爲什麼會發生這種情況?

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

+0

其實,檢查浮動等於零的點數總是返回假,除了0以及在某些情況下爲整數值。所以不要。 – Vesper

+0

@Vesper什麼?不,它不。我明白你想說什麼,但這是陳述不正確和誤導。 –

+0

@EthanWorley我的意思是,如果'a'是一個浮點數,而'b'是另一個浮點數,檢查'if(a == b)'將返回false,如果a或b被計算。其餘依賴於編譯器,例如Turbo Pascal和'{$ N +}',在var a:double上產生false;開始一個:= 2.0; writeln(a = 2.0);'但是如果擴展類型是真的。 – Vesper

回答

9

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位整數時不會進行舍入。

例如:

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

如果你想圍繞一個工作,你可以在你的設置透明度爲256的分數,並檢查它針對相同的分數:

square.alpha = 179/256; 

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

這與浮點數完全相同。有趣的是,alpha在內部以這種方式存儲(這解釋了舍入誤差大於IEEE浮點的原因),但問題完全相同。 –

+1

我同意你的說法,限制的性質是一樣的。我不同意Garry遇到的問題是由花車的限制造成的。 –

+0

噢,這解釋了它,它也解釋了爲什麼0.7與square.alpha(之前設置爲0.7)相比不匹配,因爲0.7常量不會被轉換爲8位int並返回像float α。但是如果我有兩個阿爾法設置爲0.7的精靈,比較它們會讓我平等。 另外,在這種特殊情況下,所有計算機上的alpha的最終數字都是相同的,而不是根據計算機在浮點精度情況下具有的不同而有所不同。 –

2

這是浮點數的一般限制。正如無法準確表示1/30.33333333....等)一樣,您無法精確地將(十進制)0.1表示爲二進制浮點數(0.00011001100110011001100110011...等)。

可以表達十進制0.5作爲二進制浮點數恰好(0.1),以及0.250.01)和其它餾分具有的2在分母中的冪。這就是爲什麼你看到0.5的正確結果,但不是其他人。

This part of the Python documentation解釋得很好。

相關問題