Javascript 获得更精确的浮点计算

Javascript 获得更精确的浮点计算,javascript,floating-accuracy,Javascript,Floating Accuracy,我正在使用JavaScript支持的canvas元素构建一个游戏。我的player类的一部分包括一个update()方法,该方法每勾一次调用一次。在这个方法中,我做了一些数学运算,根据键盘输入更新播放器的速度,并移动播放器。下面是一段代码: // Gradually make the players velocity 0 if(this.xv > 0) { this.xv -= 0.1; } else if(this.xv < 0) { this.xv += 0.1;

我正在使用JavaScript支持的canvas元素构建一个游戏。我的player类的一部分包括一个
update()
方法,该方法每勾一次调用一次。在这个方法中,我做了一些数学运算,根据键盘输入更新播放器的速度,并移动播放器。下面是一段代码:

// Gradually make the players velocity 0
if(this.xv > 0) {
    this.xv -= 0.1;
} else if(this.xv < 0) {
    this.xv += 0.1;
}
if(this.yv > 0) {
    this.yv -= 0.1;
} else if(this.yv < 0) {
    this.yv += 0.1;
}

// Update player position based on velocity
this.x += this.xv;
this.y += this.yv;

// Update velocity based on keyboard inputs
if(keyState[87]) {
    this.yv -= 0.5;
}
if(keyState[65]) {
    this.xv -= 0.5;
}
if(keyState[83]) {
    this.yv += 0.5;
}
if(keyState[68]) {
    this.xv += 0.5;
}
所以这里有两件事情看起来是错误的,一件是JavaScript永远不会以很高的精度计算速度,另一件是当速度为负时,它总是至少
-1
,这是一个问题,因为播放器精灵现在将以每刻度1像素的速度移动

如何获得此任务的更精确计算?

我建议使用“指数衰减”方法来平滑速度过渡。与当前用于将速度降至零的条件块不同,我将使用以下方法:

this.xv *= 0.9;
this.yv *= 0.9;
请注意,这将最大速度限制为恒定加速度的十倍,而改变衰减率将改变乘数。这可能没问题,但如果不是,可以调整方程式以简化为目标速度:

var p = 0.9;
var q = 1.0 - p;
this.xv = this.xv * p + this.txv * q;
this.yv = this.yv * p + this.tyv * q;

免责声明:这在牛顿物理学中没有真正的基础;这只是我想出的帮助机器人平稳过渡状态的方法。但这对我来说非常有效,希望对你也一样。

从这里开始你的研究:我是“指数衰减”减速方法的粉丝;如果s为
this.xv*=0.9,我将替换你的第一块
;这是0.yv*=0.9(或任何“感觉”最好的因素)。您还可以避免舍入错误后速度围绕零振荡的问题。@XavierHolt:这实际上基本上解决了这个问题。我最终还是得到了像
-0.000021784715049668016
这样的数字,但出于我的目的,我只是想避免精灵明显地“爬行”。如果你加上这个作为回答,我会接受的。
var p = 0.9;
var q = 1.0 - p;
this.xv = this.xv * p + this.txv * q;
this.yv = this.yv * p + this.tyv * q;