我的电脑变得愚蠢.0 + 20 = 19.921875 !!! 帮我!

nav*_*and 8 flash actionscript actionscript-2

当你的计算机无法获得正确的金额时,你知道这是一个错误!

我没有丝毫想到为什么会这样:

_root.attachMovie("clippy","aClip",_root.getNextHighestDepth());

trace("alpha 1 = "+aClip._alpha);
aClip._alpha = 0;
trace("alpha 2 = "+aClip._alpha);
aClip._alpha += 20;
trace("alpha 3 = "+aClip._alpha);
aClip._alpha = 20;
trace("alpha 4 = "+aClip._alpha);
Run Code Online (Sandbox Code Playgroud)

输出是:

alpha 1 = 100
alpha 2 = 0
alpha 3 = 19.921875
alpha 4 = 19.921875
Run Code Online (Sandbox Code Playgroud)

19.921875应该是20!:(

我要哭了.我的处理器有癌症吗?老年痴呆症?谁说电脑不犯错误?

PS我也使用了aClip._alpha = Math.round(aClip._alpha)但是跟踪是一样的!

Ber*_*ron 23

_alpha值存储为一个字节(我应该说8位-从一个整数值0255)

设置_alpha值时,使用百分比.检索它时,它会生成百分比的精确十进制表示.

aClip._alpha = 20;
Run Code Online (Sandbox Code Playgroud)

20%256就是51.2,因为它存储为一个整数,它会被难倒来51.

然后,

51 / 256 * 100是Flash如何将它回馈给你,这是19.921875.

  • 很好解释.我没有动作脚本的经验,甚至我去"aaahh是的,这是有道理的!我明白了!" (3认同)
  • 很好的解释.但是,IMO对Macromedias/Adob​​es部分的设计有些不好,因为1)它忽略了getter/setter原则的重要部分 - 我的意思是你将变量设置为20,但是之后得到19.!@%$^ 2)将打破简单,逻辑和可读的代码,例如`if(_alpha == 20)`,因为即使完全控制它,你也永远无法确定`_alpha`将等于什么.当然`int(_alpha)`会有所帮助,但是再一次只是在这个小混乱的顶部修补漏洞.我理解不进一步抽象的原因 - 速度. (3认同)
  • 他们使用ActionScript 3做了正确的事情 - "alpha"现在很难约束到从"0"到"1"的范围,并且无论如何都会让你准确地把它放进去.当然不包括IEEE浮点怪癖,这是交易的一部分. (2认同)