2

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

square.alpha = 0.7;

稍后在我的代码中,我在条件语句中检查此 alpha。

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

我一直在摸不着头脑,为什么直到我做了 atrace(square.alpha);而不是0.7我得到了它才起作用0.69921875

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

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

为什么会这样?

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

4

3 回答 3

9

Alpha 在引擎盖下存储为 8 位通道。该数字是由于 float -> 8-bit 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*/}
于 2013-05-27T21:46:14.473 回答
2

这是浮点数的一般限制。就像你不能1/3在十进制系统中精确地表达(0.33333333....等)一样,你也不能将(十进制)0.1精确地表达为二进制浮点数(0.00011001100110011001100110011...等等)。

可以将十进制精确地表示0.5为二进制浮点数 ( 0.1),以及0.25( 0.01) 和其他分母为 2 次方的分数。这就是为什么您看到了 的正确结果0.5,而其他的却没有。

Python 文档的这一部分很好地解释了它。

于 2013-05-27T21:00:26.657 回答
0

这与 alpha 无关……它与浮点运算有关。计算机存储浮点数的方式,一些数字往往接近你想要存储的数字。您可以在这个问题中找到更多详细信息:为什么我在 ECMAScript / ActionScript 3 中看到不精确的浮点结果?

于 2013-05-27T21:00:57.420 回答