AS3 - 为什么将DisplayObject的alpha设置为0.7实际上会导致alpha设置为0.69921875?

Gar*_*ong 2 apache-flex actionscript-3

在我的代码中的某一点,我将Sprite的alpha设置为0.7

square.alpha = 0.7;

稍后在我的代码中,我在条件语句中检查这个alpha.

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

我一直在摸不着为什么直到我做了一次trace(square.alpha);而没有工作,而不是0.7我得到了0.69921875.

0.69921875对于我设置为alpha为0.7的精灵的每个实例,这个数字()是相同的.

我做了一些测试,它看起来像唯一值alpha只返回相同的值,我将它们设置为0,0.51.其他任何东西似乎总是返回一个非常接近我设定的数字,但不完全.比如0.2会给我0.19921875

为什么会这样?

我使用Flex编译代码,不确定这是否对此有任何影响.

Eth*_*ley 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
Run Code Online (Sandbox Code Playgroud)

这不是由于其他人建议的浮点数限制.

0,0.5和1正确工作的原因是这些是在转换为8位int时不经历任何舍入的分数.

例如:

256 * 0.5 = 128 (no rounding necessary)
128 / 256 = 0.5
Run Code Online (Sandbox Code Playgroud)

如果你想要一个解决方法,你可以将你的alpha设置为256分,并检查相同的分数:

square.alpha = 179 / 256;

if (square.alpha == 179 / 256) {/*do stuff*/}
Run Code Online (Sandbox Code Playgroud)