Actionscript 3 AS3-为什么设置DisplayObject';s alpha到0.7实际上会导致alpha被设置为0.69921875?
在我的代码中有一点我将精灵的alpha设置为0.7Actionscript 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。其
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。