This question already has answers here:
Is floating point math broken?
(31个答案)
4年前关闭。
让我进一步解释我的问题。
假设我的速度为-5.4028000,我希望它像这样回到零。
与正数相同。为了使它们返回0,以0.1为一组。每次运行时它将返回0。因为这将放置在更新循环中。
我尝试过的事情:
但这只是将我的VX锁定为:
VX:0.04999999
要么
VX:0.09999999
(31个答案)
4年前关闭。
让我进一步解释我的问题。
假设我的速度为-5.4028000,我希望它像这样回到零。
-5.4,
-5.3,
-5.2
...
-0.2,
-0.1,
0
与正数相同。为了使它们返回0,以0.1为一组。每次运行时它将返回0。因为这将放置在更新循环中。
我尝试过的事情:
if(vx > 0)
{
vx-=0.1;
}
if(vx < 0)
{
vx+=0.1;
}
但这只是将我的VX锁定为:
VX:0.04999999
要么
VX:0.09999999
最佳答案
您的数字未恢复为零的原因是,由于舍入误差,最后的减法可能是减去了错误的数字。由于5.4和0.1都不能精确地用double
格式表示,因此您的最后一次减法(或在负数的情况下最后一次加法)将“过冲”。
这是Math.min(...)
和Math.max(...)
的问题。基本上,我们将只增加或减去我们需要达到零的确切数量。
if (vx > 0) {
vx -= Math.min(0.1, vx);
}
if (vx < 0) {
vx += Math.min(0.1, -vx);
}
07-26 03:49