问题在于:
当VX为某个或扣除0.05时,扣除/约0.05000001 (这参与输入框架,FPS)
**if(vx < 5 && KR){
vx += 0.05;
}else if(vx > 0 && !KR){
vx -= 0.05;
}else if(vx < 0 && !KL){
vx += 0.05;
}else if(vx < -5 && KL){
vx -= 0.05;
}
if(vy < 5 && KD){
vy += 0.05;
}else if(vy > 0 && !KD){
vy -= 0.05;
}else if(vx < -5 && KU){
vy -= 0.05;
}else if(vx < 0 && !KU){
vy += 0.05;
}
答案 0 :(得分:3)
浮点数固有地不精确 - 有理数集是无限的,但浮点Number
- s存储在64位,根据IEEE-754标准。显然,64位不是无限数量的位,因此可以精确表示某些浮点值,而其他浮点值则不能。
通常,您不能依赖浮点数来获得与您尝试分配给它的确切值相同的值。
var n:Number = 0.05;
将由编译器转换为0.05
的浮点表示,这可能会引入舍入错误。
使用浮点数时,通常必须使用所需数字的范围,而不是检查是否完全相等。所以不要做
if ( n == 0.05 ) // this may or may not fail, based on rounding
你应该做点什么
if ( ( n > 0.04 ) && ( n < 0.06 ) ) // this will more likely work
范围取决于您 - 您必须确定在进行检查时可接受的差异(此处我使用0.01)。但是,范围越小,您遇到舍入错误的可能性就越大。范围越大,您通过支票的数字越来越不精确。
这里有一个相当不错的article,它更详细。互联网上还有很多关于如何正确使用浮点数的资源。