以下是问题所在:
当VX为0.0 5或扣除0.0 5时,它将扣除/约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;
}发布于 2014-12-23 17:41:50
浮点数本质上是不精确的--有理数集是无限的,但根据IEEE-754标准,浮点Number-s存储在64位上。显然,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)。但是,范围越小,就越有可能遇到舍入错误。越大的范围,你会得到越来越多的不精确的数字,通过检查。
这里有一个相当不错的文章,详细介绍一下。互联网上也有很多关于如何正确处理浮点数的资源。
https://stackoverflow.com/questions/27625197
复制相似问题