我的电脑变得很愚蠢。0 + 20 = 19.921875!!! 求助!

8

当你的计算机无法正确计算时,你就知道出了问题!

我完全不知道为什么会发生这种情况:

_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);

输出结果为:

alpha 1 = 100
alpha 2 = 0
alpha 3 = 19.921875
alpha 4 = 19.921875

19.921875 应该是 20!:(

我要哭了。我的处理器得了癌症吗?老年痴呆?谁说电脑不会犯错呢?

另外,我也使用了 aClip._alpha=Math.round(aClip._alpha),但跟踪结果仍然相同!


1
可能与浮点数有关,但我从未涉足过ActionScript。也许转换为整数? - Wrikken
5个回答

23

_alpha值存储为一个字节(也就是8位——一个介于0255之间的整数值)

当您设置_alpha值时,使用百分比。当您检索它时,会得到一个百分比的精确十进制表示。

aClip._alpha = 20;

25620%51.2,因为它被存储为整数,所以它将被截断为51

接下来,

51 / 256 * 100是Flash返回给你的值,即19.921875


3
非常清晰易懂。虽然我没有 actionscript 的经验,但是我感觉“啊哈!我明白了!” - rownage
3
很好的解释。但在我看来,这是Macromedias/Adobes设计上的一些问题,因为它忽略了getter/setter原则的重要部分。我的意思是,你把一个变量设置成20,却在之后得到19.!$%^,其次,它会破坏直接、逻辑清晰和可读性强的代码,比如if(_alpha == 20),因为你永远无法确定_alpha将等于什么,即使完全控制它也不行。当然,int(_alpha)可以帮助解决问题,但这只是在这个小混乱上打了个补丁。虽然我理解不进一步抽象的原因是速度。 - Armen Michaeli
2
他们在ActionScript 3中做了正确的事情 - alpha现在被硬限制在从01的范围内,并且将精确地返回您输入的内容。当然,这里还包括IEEE浮点异常,这是该行业的一部分。 - Armen Michaeli

1

看起来是四舍五入


0
在Flash CS5的组件属性框中也出现了“浮点问题”。在重新安装后,CS5似乎无法正确处理组件属性,并在您输入20后显示20.00001。
通过Adobe应用程序管理器更新软件可以解决此问题。

0

如果我没记错的话,Flash 内部使用一些奇怪的值来存储 alpha 值,大概是 0 到 240 之间(我觉得不是 255)。这可能是因为它将 20 视为 20%,在四舍五入后,19.92 是转换回百分比时最接近的值吗?


-1

不管其他答案的有效性如何,浮点数实现存在已知且有文档记录的工件,其中包括 Adobe Flash Player 使用的工件。例如,以下代码将产生一个稍微不正确(如果在数学中存在这样的事情)的输出:1.0010000000000001

trace(0.1009 + 0.9001);

所有这些,就像我所说的那样,都是使用IEEE浮点规范实现的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接