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

时间:2013-05-27 20:50:16

标签: actionscript-3 flex

在我的代码中的某一点,我将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的唯一值返回与我设置的值完全相同的值00.51 。其他任何东西似乎总是返回一个非常接近我设定的数字,但不完全。例如0.2会给我0.19921875

为什么会这样?

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

3 个答案:

答案 0 :(得分:9)

Alpha存储为引擎盖下的8位通道。这个数字是浮动的 - > 8位int - >浮动转换。

这是数学:

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 :(得分:2)

这是浮点数的一般限制。就像你无法在十进制系统中完全表达1/30.33333333....等)一样,你不能将(十进制)0.1表达为二进制浮点数({{ 1}}等。)。

可以将十进制0.00011001100110011001100110011...精确表示为二进制浮点数(0.5),以及0.10.25)和其他分数在分母中具有2的幂。这就是为什么你看到0.01的正确结果,而不是其他人的结果。

This part of the Python documentation解释得非常好。

答案 2 :(得分:0)

这不是关于alpha ...它是关于浮点运算。计算机存储浮点数的方式,某些数字往往接近您想要存储的数字。您可以在此问题中找到更多详细信息:Why am I seeing inexact floating-point results in ECMAScript / ActionScript 3?