在我的代码中的某一点,我将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.5
和1
。其他任何东西似乎总是返回一个非常接近我设定的数字,但不完全。例如0.2
会给我0.19921875
为什么会这样?
我使用Flex编译代码,不确定这是否对此有任何影响。
答案 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/3
(0.33333333....
等)一样,你不能将(十进制)0.1
表达为二进制浮点数({{ 1}}等。)。
你可以将十进制0.00011001100110011001100110011...
精确表示为二进制浮点数(0.5
),以及0.1
(0.25
)和其他分数在分母中具有2的幂。这就是为什么你看到0.01
的正确结果,而不是其他人的结果。
答案 2 :(得分:0)
这不是关于alpha ...它是关于浮点运算。计算机存储浮点数的方式,某些数字往往接近您想要存储的数字。您可以在此问题中找到更多详细信息:Why am I seeing inexact floating-point results in ECMAScript / ActionScript 3?