Actionscript 3 AS3-为什么设置DisplayObject';s alpha到0.7实际上会导致alpha被设置为0.69921875?

Actionscript 3 AS3-为什么设置DisplayObject';s alpha到0.7实际上会导致alpha被设置为0.69921875?,actionscript-3,apache-flex,Actionscript 3,Apache Flex,在我的代码中有一点我将精灵的alpha设置为0.7 square.alpha=0.7 在代码的后面,我在条件语句中检查这个alpha if(square.alpha==0.7){//do stuff} 直到我做了一个跟踪(square.alpha),我才明白为什么它不起作用而不是0.7我得到了0.69921875 这个数字(0.69921875)对于我设置为alpha为0.7的精灵的每个实例都是相同的 我做了一些测试,看起来只有alpha的值返回与我设置的值完全相同的值,分别是0、0.5和1。其

在我的代码中有一点我将精灵的alpha设置为0.7

square.alpha=0.7

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

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

直到我做了一个
跟踪(square.alpha),我才明白为什么它不起作用而不是
0.7
我得到了
0.69921875

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

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

为什么会发生这种情况


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

这是浮点数的一般限制。正如你不能准确地用十进制表示
1/3
0.33333333…
等),你也不能准确地将(十进制)
0.1
表示为二进制浮点数(
0.000110011…
等)

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


解释得很好。

这与阿尔法无关。。。这是关于浮点运算的。计算机存储浮点数的方式,有些数字往往与您想要存储的接近。您可以在这个问题中找到更多详细信息:

Alpha作为8位通道存储在引擎盖下。该数字是由浮点->8位整数->浮点转换产生的

以下是数学:

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
如果您想要解决此问题,可以将alpha设置为256的分数,并对照相同的分数进行检查:

square.alpha = 179 / 256;

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

这与浮点数的限制完全相同。有趣的是,alpha是以这种方式在内部存储的(这解释了为什么舍入误差比IEEE浮点更大),但问题是完全相同的。我同意你的观点,即限制的性质是相同的。我不同意Garry遇到的问题是由浮点限制引起的。哦,这就解释了这一点,也解释了为什么0.7与square.alpha(之前设置为0.7)不匹配,因为0.7常量不会像alpha那样转换为8位int并返回浮点。但是如果我有两个精灵的alphas都设置为0.7,比较它们会得到相等的结果。在这种特殊情况下,所有计算机上的alpha的最终数字都是相同的,而不是像在浮点精度的情况下,根据计算机的芯片可能会有所不同。实际上,检查浮点数是否相等总是返回false,除了0,在某些情况下,整数值。那就别这样了。@Vesper什么?不,没有。我理解你想说的,但这是一个不正确和误导性的陈述。@EthanWorley我的意思是,如果
a
是一个浮点数,
b
是另一个浮点数,检查
if(a==b)
将在计算a或b时返回false。其余的依赖于编译器,比如turbopascal和
{$N+}
vara:double上产生false;开始a:=2.0;写入(a=2.0)但如果类型为扩展,则为true。