Flash加法错误

Flash加法错误,flash,actionscript-3,math,floating-point,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; trac

在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
为什么出错?我只是在做一个普通的高分辨率加法


有什么解决办法吗?

这是一个标准的浮点问题。二进制浮点数不能完美地表示十进制数的全部范围,您需要按照

trace (round (a, 1))
或者,更好的办法是,将其转换为字符串,去掉超过第一个小数位数的所有内容(因为舍入的结果可能也不容易用二进制表示)

虽然我不知道动作脚本。尽管如此,这仍然是一个众所周知的问题,并不局限于AS3


例如,请参见或。

这是一个标准的浮点问题。二进制浮点数不能完美地表示十进制数的全部范围,您需要按照

trace (round (a, 1))
或者,更好的办法是,将其转换为字符串,去掉超过第一个小数位数的所有内容(因为舍入的结果可能也不容易用二进制表示)

虽然我不知道动作脚本。尽管如此,这仍然是一个众所周知的问题,并不局限于AS3


例如,请参见或。

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

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