Flash加法错误
在Flash中创建一个新的AS3文档,在下面的代码中粘贴并运行它: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
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。这避免了浮点运算中固有的所有舍入错误