Flash添加错误

时间:2008-12-14 02:52:58

标签: flash actionscript-3 math floating-point

在Flash中制作新的AS3文档,在以下代码中粘贴运行它:

var a:Number=0;
trace(a)  //  0
a+=0.3;
trace(a)  //  0.3
a+=0.3;
trace(a)  //  0.6
a+=0.3;

trace(a)  //  0.8999999999999999
a+=0.3;
trace(a)  //  1.2
a+=0.3;
trace(a)  //  1.5
a+=0.3;
trace(a)  //  1.8
a+=0.3;
trace(a)  //  2.1
a+=0.3;
          //  ^ This is the output. Notice the inaccuracy starting from 0.9 / 0.89

为什么会出错?我只是在做一个普通的高分辨率添加。

任何解决方法?

2 个答案:

答案 0 :(得分:8)

这是一个标准的浮点问题。二进制浮点数不能代表完整精确的十进制数范围,你需要做的事情

trace (round (a, 1))

或者,更好的是,将它变成一个字符串并剥离超过第一个小数位的所有内容(因为舍入的结果也可能不容易用二进制表示)。

虽然我不知道ActionScript。它仍然是一个众所周知的问题,并不仅限于AS3。

例如,请参阅Why do I see a double variable initialized to some value like 21.4 as 21.399999618530273?Strange floating-point behaviour in a Java programWhat is a simple example of floating point/rounding error?

答案 1 :(得分:0)

一种解决方法是使用缩放整数类型。对于此示例,您可以增加3,然后在输出之前除以10。这避免了浮点运算中固有的所有舍入误差。