在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
为什么会出错?我只是在做一个普通的高分辨率添加。
任何解决方法?
答案 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 program或What is a simple example of floating point/rounding error?。
答案 1 :(得分:0)
一种解决方法是使用缩放整数类型。对于此示例,您可以增加3,然后在输出之前除以10。这避免了浮点运算中固有的所有舍入误差。